switch中case中变量定义的问题
2014-03-10 23:35
701 查看
今天写C代码时在case中定义了变量变异处错误,代码如下
使用GCC编译出现:12:7: 错误: 标号只能是语句的一部分,而声明并非语句。
但是修改了一下,如下
下面是个人理解:
由于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)。
#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)。
相关文章推荐
- C语言switch case语句中定义变量问题
- C语言switch case语句中定义变量问题
- C语言switch case语句中定义变量问题
- C语言switch case语句中定义变量问题
- Switch-case 内定义变量的问题
- C++:在switch的case中定义变量的问题
- switch-case 中的分支中变量定义 编译不通过问题
- switch case关于定义变量的规定
- 在switch-case中定义变量时当心被“穿越” .
- switch语句中case跳过变量初始化的问题
- 请教switch内部的变量定义问题?
- switch 语句内部变量的定义问题
- switch内部定义变量须注意的问题
- 在case语句中定义变量的问题
- 在switch-case中定义变量时当心被“穿越”
- 在switch-case中定义变量时当心被“穿越”
- 关于C语言中switch的case里定义变量解决编译报错
- 解决JAVA switch case 里面case A, A不能为 变量的问题
- 定义一个结构体变量(包括年、月、日),编写程序,要求输入年月日,程序能够计算并输出改日是本年中的第几天。注意闰年问题。(switch语句)
- 在case语句中定义变量的问题