|
发表于 2003-9-12 03:57:11
|
显示全部楼层
首先要承认作者提出这个问题很好,很多人都会碰上的这种情况,但是他本身对这个问题的理解个人认为存在误区或者说不到位。
下面是我的分析:
- switch (t)
- {
- case 0:
- int a = 0;
- break;
- default:
- break;
- }
复制代码
g++ 下的错误提示是:
case_init.cpp:9: error: jump to case label
case_init.cpp:7: error: crosses initialization of `int a'
首先在这里作者提到问题出在本地(local)变量或者叫做自动变量的作用域范围,点的很好。本地变量的作用域仅在花括号之间。于是方案1:
- switch (t)
- {
- case 0:
- { //added for fix problem
- int a = 0;
- break;
- } //added for fix problem
- default:
- break;
- }
复制代码
问题得到解决,在新的约束范围内,变量 a 很好的工作,而且也正确的实现了意图。接着方案2:
- switch (t)
- {
- case 0:
- int a;
- a = 0;
- break;
- default:
- break;
- }
复制代码
也没错。似乎两个方案都完成了目的,而且等价。于是作者把注意力完全转移到初始化问题上,纠住不放,到最后也没讲清楚为何有时候可以初始化,有时候确不能。
其实再深入一步,就完全清楚了,我把程序改动了一下,加了几个打印语句:
- #include <stdio.h>
- int main()
- {
- printf("请输入一个数字: ");
- int t;
- scanf("%d", &t);
- switch (t)
- {
- case 0:
- int a;
- printf("\n a = %d\n", a = 0);
- break;
- case 1:
- printf("\n a = %d\n", a = 1);
- break;
- default:
- printf("\n a = %d\n", a = t);
- break;
- }
- }
复制代码
编译通过,然后运行一下看看,一切正常。可能有人会很奇怪, int a 是在 case 0 中声明的呀!如果运行时选择 1,不就跳过去了吗?怎么在 case 1 和 default 中也能用呀?
殊不知不管你是有没有选 0, 这样定义的局部变量 a 在它的作用域(从声明处到结束花括号)范围之内
都有效。
到这里该明白编译器为何对 int a = 0; 初始化作出反应吧!
虽然你自己知道只在 case 0 中用到 a,在 case 1 或 default 中都不会用到 a(非上例),但编译器不懂你的心思,
为了避免在其它地方用到该变量出现不必要的麻烦,做一个出错提醒。 至于下面这个 class 的例子,道理一样。
所谓尽信书不如无书,何况并非大师的手笔,我们看的时候得多长个心眼,多动动手有助于问题分析。 |
|