转自:

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. 【leetcode】Largest Plus Sign

    题目如下: In a 2D grid from (0, 0) to (N-1, N-1), every cell contains a 1, except those cells in the giv ...

  2. Cassandra 集群配置

    集群机制 一致性哈希(数据一致性) Token Range Partitoner Gossip协议(流言,无中心获取领导者) 用于在环内节点之间传播状态信息 周期运行,每次在环中随机挑选一个对象节点, ...

  3. ubuntu日常

    1804 处理 1,修改为固定ip vim /etc/netplan/01-netcfg.yaml network: version: 2 renderer: networkd ethernets: ...

  4. vue学习-day03(动画,组件)

    目录: 1.品牌列表-从数据库获取列表    2.品牌列表-完成添加功能    3.品牌列表-完成删除功能    4.品牌列表-全局配置数据接口的根域名    5.品牌列表-全局配置emulateJS ...

  5. Win7,win10(部分机型) 安装appscan9.0.3.10(可升级)实操流程

    Win10部分机型不能很好的兼容appscan,建议使用者用win7系统安装appscan 写于:2018.12.2 IBM Security AppScan Standard 可通过自动执行应用安全 ...

  6. Iterator(遍历器) 和 for...of 循环

    是generator的前置知识 generator :https://www.cnblogs.com/wangtong111/p/11322961.html 遍历器(Iterator)就是这样一种机制 ...

  7. [LeetCode]-DataBase-Department Highest Salary

    The Employee table holds all employees. Every employee has an Id, a salary, and there is also a colu ...

  8. json-server 服务器的接口

    服务器接口的数据在浏览器网络地址中,便可查看: 获取接口的数据需要在网络地址后面,填写接口的名字即可,(对于 json-server来说)

  9. Git+Jenkins配置

    一.新建任务 admin账户登陆jenkins,点击新建按钮-> 选择构建一个自由风格的软件项目,item name 随便输入一个自己认为有意义的名字,点击OK 二.源码管理 源码管理-> ...

  10. Delphi XE2 之 FireMonkey 入门(38) - 控件基础: TPopupMenu、TMenuItem、TMenuBar、TMainMenu

    Delphi XE2 之 FireMonkey 入门(38) - 控件基础: TPopupMenu.TMenuItem.TMenuBar.TMainMenu 相关控件: TMenuBar.TPopup ...