在switch-case语句中初始化声明无效,但允许声明然后分配。如下面的代码片段所示。
编译器端这两种类型的初始化有什么区别?为什么第一种类型的初始化无效,第二种类型是有效的。
switch(val)
{
case 0:
int newVal = 42; //Invalid
break;
case 1:
int newVal2; //Valid
newVal2 = 42;
break;
case 2:
break;
}
答案 0 :(得分:10)
实际上,规则是你不能跳过具有初始化(或超过非POD类型变量声明)的声明的块。 C ++标准说(C ++03§6.7):
可以转换为块,但不能以初始化绕过声明的方式。从具有自动存储持续时间的局部变量不在其范围内的点跳转(77)的程序是不正确的,除非该变量具有POD类型(3.9)并且在没有初始值设定项的情况下声明(8.5)。
(*)从
switch
语句到case
标签的条件的转移在这方面被视为跳跃。
int newVal = 42;
是一个具有初始化程序(= 42
部分)的声明。该程序格式错误,因为如果val
为1
或2
,您将在初始化后跳转到切换块。
int newVal2;
也是一个宣言;因为int
是POD类型且声明没有初始值设定项,所以您可以跳过此声明。
答案 1 :(得分:5)
事实上,它们都不是合法的C ++。除非是作用域,否则不能在switch case中声明变量:
switch(val)
{
case 0:
{
int newVal = 42; // now valid
}
break;
case 1:
{
int newVal2; // still Valid
newVal2 = 42;
}
break;
case 2:
break;
}
您的编译器允许案例1的事实是编译器的缺陷,或者可能是扩展。至少,根据标准。