C ++

在switch-case语句中,带初始化的 声明是无效的,但声明和然后赋值是允许的。 如以下代码片段所示。

这两种类型的编译器初始化有什么区别? 为什么第一种类型的初始化无效,第二种类型是有效的。

switch(val)  
{  
case 0:  
  int newVal = 42;  //Invalid
  break;
case 1:  
  int newVal2;      //Valid
  newVal2 = 42;  
  break;
case 2:
  break;
}

实际上,规则是您不能通过具有初始化的声明(或超过非POD类型变量的声明)跳到块中。 C ++标准说(C ++ 03§6.7):

可以将其转换为块,但不能绕过具有初始化的声明。 从具有自动存储持续时间的局部变量不在范围内的点跳转(77)到其范围内的点的程序是格式错误的,除非该变量具有POD类型(3.9)并且没有初始化程序( 8.5)。

(*)从switch语句到case标签的switch在这方面被认为是一种跳跃。

int newVal = 42; 是一个具有初始值的声明( = 42部分)。 该程序不合格,因为如果val12 ,则会在初始化之后跳入切换块。

int newVal2; 也是一个声明; 因为int是一个POD类型,并且声明没有初始化器,所以可以跳过这个声明。


事实上,合法的C ++都不是。 你不能在开关情况下声明一个变量,除非它的范围是:

switch(val)  
{  
case 0:  
  {
    int newVal = 42;  // now valid
  }
  break;
case 1:  
  {
    int newVal2;      // still Valid
    newVal2 = 42;  
  }
  break;
case 2:
  break;
}

你的编译器允许情况1的事实是你的编译器或者扩展的缺陷。 至少,根据标准。

链接地址: http://www.djcxy.com/p/84387.html

上一篇: c++

下一篇: In Apache Spark. How to set worker/executor's environment variables?