switch里面不能做什么?
2016-01-18 23:20
190 查看
C++课设的时候,室友喊我帮他看一下这个错误,具体的代码不记得了,形式上是这样的(其他的某些break就没写了):
我们都知道{ }能把变量限制在里面,也就是说变量的生存期被强行固定在里面了,我们向外看一下,switch也是有括号的!那么在某一个case分支的声明的变量算谁的呢?当然算switch的!照这么看,一个case的变量看似可以和其它case共享。但是这样是有风险的,仔细想一想:我们从case1进去,假设case1里面有一个integer a=10,然后就break出去了,这样没有问题。但是假如我们从case5进去,遇到printf("%d",a)那这样就出现了奇怪的状况,printf不认识这个a了!它当然不认识,直接从case5进去,是「跳过」了case1的,关于a,它不知道。
这是一种非常特殊的语法现象,缘由可以说是switch分支结构搞的鬼,可能具体的要看汇编来解释,有时间我也会问一下计科的朋友。最后说一下这种问题怎么解决,很简单:
把a的作用域限制在某一个case分支里面了,用完马上丢掉。记住break不要放到{ }里面来以免不必要的错误,如果确实想在各个case之间进行传递,还是想办法用函数吧。
记住{ }里面就是属于自己的私有世界。
<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之间进行传递,还是想办法用函数吧。
记住{ }里面就是属于自己的私有世界。
相关文章推荐
- PHP8新特性之match表达式
- 三个有用的 Switch 命令
- js 中的switch表达式使用示例
- php中switch与ifelse的效率区别及适用情况分析
- c#中switch case的用法实例解析
- Go语言中的switch用法实例分析
- php switch语句多个值匹配同一代码块应用示例
- android基本控件ToggleButton&Switch使用指南
- 解析c语言switch中break语句的具体作用
- 深入剖析Go语言编程中switch语句的使用
- PHP的switch判断语句的“高级”用法详解
- php中switch语句用法详解
- Repeater里switch的使用方法
- javascript使用switch case实现动态改变超级链接文字及地址
- JavaScript中switch语句的用法详解
- JavaScript中switch判断容易犯错的一个细节
- javascript的switch用法注意事项分析
- javascript中if和switch,==和===详解
- Java中switch判断语句典型使用实例
- Asterisk DialPlan Switch