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
部分)。 该程序不合格,因为如果val
为1
或2
,则会在初始化之后跳入切换块。
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?