在阅读了所有答案和更多研究之后,我得到了一些东西。
Case statements are only 'labels'
在 C 中,根据规范,
§6.8.1 标记语句:
labeled-statement:
identifier : statement
case constant-expression : statement
default : statement
在 C 中,没有任何子句允许“带标签的声明”。它只是不是语言的一部分。
所以
case 1: int x=10;
printf(" x is %d",x);
break;
这不会编译,请参阅http://codepad.org/YiyLQTYw。GCC 给出一个错误:
label can only be a part of statement and declaration is not a statement
甚至
case 1: int x;
x=10;
printf(" x is %d",x);
break;
这也没有编译,请参阅http://codepad.org/BXnRD3bu。在这里,我也遇到了同样的错误。
在 C++ 中,根据规范,
允许标记声明,但不允许标记初始化。
请参阅http://codepad.org/ZmQ0IyDG。
解决这种情况的方法有两个
使用 {} 使用新范围
case 1:
{
int x=10;
printf(" x is %d", x);
}
break;
或使用带有标签的虚拟语句
case 1: ;
int x=10;
printf(" x is %d",x);
break;
在 switch() 之前声明变量,如果满足您的要求,则在 case 语句中使用不同的值对其进行初始化
main()
{
int x; // Declare before
switch(a)
{
case 1: x=10;
break;
case 2: x=20;
break;
}
}
switch 语句的更多内容
永远不要在 switch 中写任何不属于任何标签的语句,因为它们永远不会执行:
switch(a)
{
printf("This will never print"); // This will never executed
case 1:
printf(" 1");
break;
default:
break;
}
请参阅http://codepad.org/PA1quYX3。