您的位置:首页 > 其它

switch中case中变量定义的问题

2014-03-10 23:35 633 查看
今天写C代码时在case中定义了变量变异处错误,代码如下

#include <stdio.h>

int main()
{
int n;
scanf("%d", &n);
switch(n){
case 0:
printf("it's 0\n");
break;
case 1:
int i = 2;
printf("it's 1, i = 2\n");
break;
}
return 0;
}


使用GCC编译出现:12:7: 错误: 标号只能是语句的一部分,而声明并非语句。

但是修改了一下,如下

#include <stdio.h>

int main()
{
int n;
scanf("%d", &n);
switch(n){
case 0:
printf("it's 0\n");
break;
case 1:
{
int i = 2;
printf("it's 1, i = 2\n");
}
break;
}
return 0;
}
此时编译通过了,结果也正确。

下面是个人理解:

由于switch的几个case语句在同一个作用域(因为case 语句只是标签,它们共属于一个swtich语句块),所以如果在某个case下面声明变量的话,其他的case语句也能看到,这样的话就可能导致错误,例如在地一段代码中的case 1后面还有个case 2的话,且case 2中使用了case 1定义的变量i的话,那么如果运行时n = 2,switch直接跳转到case2内部,这样就出现了i没有初始化的事情了(变量的声明是在编译阶段,而变量的赋值则是在运行时),如果能够运行的话,则在case 2中,i的初始值将是一个未知值。所以编译器直接避免这种事情的发生,就让其编译无法通过。

而很明显加上花括号之后,i的作用域就很明确了。

另外,switch(expression)其中expression的结果必须是整型(字符、短整、长整),case constant-expression中constant-expression必须是一个整型值,不能是任何表达式。

文章参考了别人的提问及相关解答(http://bbs.csdn.net/topics/390026156)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: