我一直想知道这一点 - 为什么你不能在switch语句中的case标签之后声明变量?在C++中,您可以在任何地方声明变量(并且声明它们接近第一次使用显然是一件好事)但是以下仍然不起作用:
switch (val)
{
case VAL:
// This won't work
int newVal = 42;
break;
case ANOTHER_VAL:
...
break;
}
Run Code Online (Sandbox Code Playgroud)
以上给出了以下错误(MSC):
'case'标签跳过'newVal'的初始化
这似乎也是其他语言的限制.为什么会出现这样的问题?
在我看来,定义总是意味着存储分配.
在以下代码中,int i在程序堆栈上分配一个4字节(通常)存储并将其绑定到i,i = 3并将3分配给该存储.但是因为goto,定义被绕过,这意味着没有分配存储空间i.
我听说局部变量在函数的入口处(f()在这种情况下)分配在它们所在的位置,或者在定义点处.
但无论哪种方式,如何i在尚未定义的情况下使用它(根本没有存储空间)?执行时分配给值3的位置在哪里i = 3?
void f()
{
goto label;
int i;
label:
i = 3;
cout << i << endl; //prints 3 successfully
}
Run Code Online (Sandbox Code Playgroud)