阅读所有答案和更多研究后,我得到了一些东西。
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(a)
{
printf("This will never print"); // This will never executed
case 1:
printf(" 1");
break;
default:
break;
}
参见http://codepad.org/PA1quYX3。