关于在case中定义变量

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

switch中case中变量定义的问题

2014年09月05日⁄综合⁄共 851字⁄字号小中大⁄评论关闭

今天写C代码时在case中定义了变量变异处错误,代码如下

#include

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

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必须是一个整型值,不能是任何表达式。

相关文档
最新文档