switch里面不能做什么?

来源:互联网 发布:单片机烟雾报警器 编辑:程序博客网 时间:2024/04/30 14:36

C++课设的时候,室友喊我帮他看一下这个错误,具体的代码不记得了,形式上是这样的(其他的某些break就没写了):

<span style="font-size:14px;">switch(a){case 1:case 2: int a;scanf("%d",&a);cout<<a;break;...case n:}</span>
  过不了编译,为什么呢?刚开始我想是不是没打{ }符号?但是我又想起来C/C++里面唯一不强制用{ }做代码块的就是switch里面的case!网上搜了一下之后就知道这怎么解决了,这和作用域是有关系的!

  我们都知道{ }能把变量限制在里面,也就是说变量的生存期被强行固定在里面了,我们向外看一下,switch也是有括号的!那么在某一个case分支的声明的变量算谁的呢?当然算switch的!照这么看,一个case的变量看似可以和其它case共享。但是这样是有风险的,仔细想一想:我们从case1进去,假设case1里面有一个integer a=10,然后就break出去了,这样没有问题。但是假如我们从case5进去,遇到printf("%d",a)那这样就出现了奇怪的状况,printf不认识这个a了!它当然不认识,直接从case5进去,是「跳过」了case1的,关于a,它不知道。

  这是一种非常特殊的语法现象,缘由可以说是switch分支结构搞的鬼,可能具体的要看汇编来解释,有时间我也会问一下计科的朋友。最后说一下这种问题怎么解决,很简单:

<span style="font-size:14px;">switch(a){case 1:case 2: {int a;scanf("%d",&a);cout<<a;}break;...case n:}</span>

把a的作用域限制在某一个case分支里面了,用完马上丢掉。记住break不要放到{ }里面来以免不必要的错误,如果确实想在各个case之间进行传递,还是想办法用函数吧。


记住{ }里面就是属于自己的私有世界。

0 0
原创粉丝点击