我一直在想这个问题——为什么不能在switch语句的case标签后面声明变量呢?在c++中,你可以在任何地方声明变量(并且在第一次使用时声明它们显然是一件好事),但以下仍然不能工作:
switch (val)
{
case VAL:
// This won't work
int newVal = 42;
break;
case ANOTHER_VAL:
...
break;
}
上面给了我以下错误(MSC):
'newVal'的初始化被'case'标签跳过
这在其他语言中似乎也是一个限制。为什么这是一个问题?
到目前为止,答案都是c++。
对于c++,你不能跳过初始化。但是,在C语言中,声明不是语句,大小写标签后面必须跟着语句。
所以,有效(但丑陋)的C,无效的c++
switch (something)
{
case 1:; // Ugly hack empty statement
int i = 6;
do_stuff_with_i(i);
break;
case 2:
do_something();
break;
default:
get_a_life();
}
相反,在c++中,声明是一个语句,因此下面的语句是有效的c++,无效的C
switch (something)
{
case 1:
do_something();
break;
case 2:
int i = 12;
do_something_else();
}
到目前为止,答案都是c++。
对于c++,你不能跳过初始化。但是,在C语言中,声明不是语句,大小写标签后面必须跟着语句。
所以,有效(但丑陋)的C,无效的c++
switch (something)
{
case 1:; // Ugly hack empty statement
int i = 6;
do_stuff_with_i(i);
break;
case 2:
do_something();
break;
default:
get_a_life();
}
相反,在c++中,声明是一个语句,因此下面的语句是有效的c++,无效的C
switch (something)
{
case 1:
do_something();
break;
case 2:
int i = 12;
do_something_else();
}