转自:

http://blog.chinaunix.net/uid-27103408-id-3340702.html

http://www.xuebuyuan.com/2070170.html

switch是我们做条件选择时,经常用到的一个语句。一直以来对于他的使用相信大家也都是得心应手,前几天在linux下写一个c++程序时遇到了这样的一个问题,请看例子:
#include<iostream>
using namespace std;
int main()
{
        int i;
        cout<<"please input the value of  i ---(0-9)"<<endl;
        cin >> i;
        switch(i)
        {
                case 0:
                        int j = 3;
                        cout << j <<endl;
                        break;
                case 4:
                case 1:
                case 2:
                        break;
        }
        return 0;
}
不知道大家看出这个程序问题在什么地方没有,一开始我是没有感觉有什么不对的地方,后来编译的时候就出现了问题:
testswitch.cpp:14:8: 错误: 跳转至 case 标号 [-fpermissive]
testswitch.cpp:11:8: 错误:   跳过了‘int j’的初始化
testswitch.cpp:15:8: 错误: 跳转至 case 标号 [-fpermissive]
testswitch.cpp:11:8: 错误:   跳过了‘int j’的初始化
testswitch.cpp:16:8: 错误: 跳转至 case 标号 [-fpermissive]
testswitch.cpp:11:8: 错误:   跳过了‘int j’的初始化
大致的意思是,系统不允许我们在case中定义一个变量,原因是我们在一个case中定义的变量,假如在另一个case中被使用就会出现错误,因为一般来说switch语句中的case只能被执行一个。
但是我们假如是想要定义一个在case中使用的临时变量,那该怎么办呢。当然是有办法的其实也很简单就是我们在写case语句时给每一个case加一个大括号就行了。例如程序假如如下写就没有问题:

(c语言中的报错是:标号只能是语句的一部分,而声明并非语句。)
#include<iostream>
using namespace std;
int main()
{
        int i;
        cout<<"please input the value of  i ---(0-9)"<<endl;
        cin >> i;
        switch(i)
        {
                case 0:
                {
                        int j = 3;
                        cout << j <<endl;
                        break;
                }
                case 4:
                case 1:
                case 2:
                        break;
        }
        return 0;
}
之所以加大括号就是为了明确我们声明的变量的作用域,就是仅仅在本case之中。

对此问题的分析:

由于switch的几个case语句在同一个作用域(因为case 语句只是标签,它们共属于一个swtich语句块),所以如果在某个case下面声明变量的话,其他的case语句也能看到,这样的话就可能导致错误,例如在地一段代码中的case 1后面还有个case 2的话,且case 2中使用了case 1定义的变量i的话,那么如果运行时n = 2,switch直接跳转到case2内部,这样就出现了i没有初始化的事情了(变量的声明是在编译阶段,而变量的赋值则是在运行时),如果能够运行的话,则在case 2中,i的初始值将是一个未知值。所以编译器直接避免这种事情的发生,就让其编译无法通过。而很明显加上花括号之后,i的作用域就很明确了。

当然这里我们提到的问题,并不是每个编译器都会存在。我试验过java之中就不存在这样的问题,我们可以随意在case中声明变量,因为java之中已经明确规定了case中变量的作用域。这可能是c++编译器设计上的一个小小的不足吧!这里拿出来跟大家分享一下,希望对大家有点用处吧

swtich和case语句中,定义变量要加花括号的更多相关文章

  1. 在switch中的case语句中声明变量编译出错的解决方案

    在switch中的case语句中声明变量编译的问题 先来看段代码,别管什么意思: : , j = ; ; i < ; i++) recive_phone[i] = msgbuf.text[i]; ...

  2. 在switch中的case语句中声明变量会被提前

    原文链接:http://my.oschina.net/u/2000201/blog/514384 本人今天在编写工具类时,无意之间发现,在Java的Swith语句的case语句中声明局部变量时出现了一 ...

  3. 关于case语句中声明变量并初始化的注意事项

    今天看到一句对这个问题特别精辟的总结,记录如下: It is possible to transfer into a block, but not in a way that bypasses dec ...

  4. java和C#中 定义变量,加一个小括号是什么意思。。。

    在群里灌水发现,有人这样定义字符串,感觉很好奇..又问了群友,群友说这样定义没问题.. String strtemp = ("test"); 我自己试了下,java和C#都可以,C ...

  5. for语句中声明变量

    在C语言中,局部变量应该在函数的可执行语句之前定义,但在C++中变量可在任何语句位置定义,只要允许程序语句的地方,都允许定义变量. 在C99标准中C同C++一样允许在for循环语句中定义变量.并且这个 ...

  6. case中定义变量

    1.c语言switch/case中定义变量   case 0: int b = 0 ; printf("0");break; case 1: printf("1" ...

  7. sql 语句中定义的变量不能和 sql关键字冲突

    sql 语句中定义的变量不能和 sql关键字冲突 from bs_email_account account LEFT JOIN bs_group_info gp ON account.group_i ...

  8. (转载)JavaScript中定义变量

    (转载)http://blog.163.com/xuxiaoqianhz@126/blog/static/165190577201061594421870/ JavaScript中定义变量有两种方式: ...

  9. JavaScript 中定义变量时有无var声明的区别

    关于JavaScript中定义变量时有无var声明的区别 var a=5; //正确 a=5; //正确 在javascript中,以上两种方法都是定义变量的正确方法.微软的Script56.CHM中 ...

随机推荐

  1. 数据结构-STL序列式容器总结

    根据序列在容器中的排列特性,将常见数据结构分为:序列式容器和关联式容器. 常见序列式容器有 1.array(build-in)c++內建 2.vector 3.heap(以算法方式呈现) 4.prio ...

  2. 【leetcode】Basic Calculator III

    题目如下: Implement a basic calculator to evaluate a simple expression string. The expression string may ...

  3. 文件的读写过程open read write close

    在python中,读写文件有3个步骤: 调用open()函数,返回一个File对象. 调用File对象的read()或write()方法. 调用File对象的close()方法,关闭该文件. 在读取或 ...

  4. BZOJ 2281 Luogu P2490 [SDOI2011]黑白棋 (博弈论、DP计数)

    怎么SDOI2011和SDOI2019的两道题这么像啊..(虽然并不完全一样) 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?i ...

  5. chrome插件报错原因

    Chrome报错提示Unchecked runtime.lastError: The message port closed before a response was received. 出错原因: ...

  6. Oracle升级11.2.0.3-11.2.0.4(Windows)

    背景:解决11.2.0.3带来的ora-08103错误,将数据库seinescm升级到11.2.0.4版本方法:另辟路劲安装11.2.0.4版本数据库软件,再对现有的数据库进行升级步骤:1.    检 ...

  7. [BZOJ1059]:[ZJOI2007]矩阵游戏(二分图匹配)

    题目传送门 题目描述 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏——矩阵游戏.矩阵游戏在一个N×N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两种 ...

  8. 用ps 查看线程状态

    ps -eLo pid,tid,class,rtprio,ni,pri,psr,pcpu,pmem,stat,wchan:30,comm 线程相关选项: THREAD DISPLAY H Show t ...

  9. 用Vue来实现音乐播放器(二十三):音乐列表

    当我们将音乐列表往上滑的时候   我们上面的歌手图片部分也会变小 当我们将音乐列表向下拉的时候   我们的图片会放大 当我们将音乐列表向上滑的时候   我们的图片有一个高斯模糊的效果 并且随着我们的列 ...

  10. WPF 绑定数据方式

    ======================================================================== Foreground="{Binding P ...