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
- switch里面不能做什么?
- JavaScript不能做什么
- JavaScript不能做什么
- 技术不能做什么
- precreatewindow里面做了什么?
- 不能做switch()的参数类型
- ISR之不能做什么
- ISR之不能做什么
- Hadoop不是/不能做什么
- ISR之不能做什么
- ISR之不能做什么
- 设计模式不能做什么
- switch case语句里面不能定义对象,解决方法
- 大学里面应该做些什么?
- Excel Service能做什么和不能做什么
- switch case语句里面不能定义对象 错误信息:Cannot jump from switch statement to this case..
- 详解什么软件项目不能做?
- 什么都不能做的代码记录
- 第五篇
- webrtc代码更新
- C++制作俄罗斯方块 日志
- 你所谓的努力,有事其实一文不值-------献给深陷bat的码农们
- 使用Qt制作一个简易计算器
- switch里面不能做什么?
- Android开发从零开始(1)--2016.01.18
- sublime Text2编译lua(windows平台)
- AES加解密以及示例
- CBC6 皮肤VclSkin5.6的安装
- Java抽象类与抽象方法
- 实习期间的心态调整
- 我的Android进阶之旅------>关于使用CSDN-markdown编辑器来编写博客
- 复数相关的等式及证明