switch分支作用域问题

我们做条件选择时,经常会用到switch语句,相信大家对于它的使用也都是得心应手。前几天有人问我switch分支中为什么使用临时变量会报错,借此就写了个简单的Demo演示了一把,有疑问的小伙伴可以参照Demo亲自测试一下,实践才是检验真理的唯一标准。以下是错误程序,小伙伴们不妨瞜一眼先,看自己平时是不是也是这样编写的,而只是碰巧平时没有在case分支中使用临时变量罢了。

#if 1
#include <iostream>enum PROTOCOL_TYPE
{TCP = 0x00,UDP = 0x01,ARP = 0x10,HTTP = 0x11,FTP = 0x100,SSH = 0x101
};void protocolExchange(PROTOCOL_TYPE cType)
{switch (cType){case TCP:std::cout << "TCP协议" << std::endl;break;case UDP:int cType = '1';std::cout << "UDP协议" << cType << std::endl;break;case ARP:std::cout << "ARP协议" << std::endl;break;case HTTP:std::cout << "HTTP协议" << std::endl;break;case FTP:std::cout << "FTP协议" << std::endl;break;case SSH:std::cout << "SSH协议" << std::endl;break;default:std::cout << "未知协议" << std::endl;break;}
}int main(int argc, char **argv)
{protocolExchange(TCP);protocolExchange(UDP);return 0;
}#endif

win 10系统,Visual Studio 2013编辑器,编译报错如下

1>------ 已启动生成:  项目: MainTest, 配置: Debug Win32 ------
1>  main.cpp
1>d:\project\c++\maintest\maintest\main.cpp(25): error C2360: “cType”的初始化操作由“case”标签跳过
1>          d:\project\c++\maintest\maintest\main.cpp(22) : 参见“cType”的声明
1>d:\project\c++\maintest\maintest\main.cpp(28): error C2360: “cType”的初始化操作由“case”标签跳过
1>          d:\project\c++\maintest\maintest\main.cpp(22) : 参见“cType”的声明
1>d:\project\c++\maintest\maintest\main.cpp(31): error C2360: “cType”的初始化操作由“case”标签跳过
1>          d:\project\c++\maintest\maintest\main.cpp(22) : 参见“cType”的声明
1>d:\project\c++\maintest\maintest\main.cpp(34): error C2360: “cType”的初始化操作由“case”标签跳过
1>          d:\project\c++\maintest\maintest\main.cpp(22) : 参见“cType”的声明
1>d:\project\c++\maintest\maintest\main.cpp(37): error C2361: “default”标签跳过“cType”的初始化操作
1>          d:\project\c++\maintest\maintest\main.cpp(22) : 参见“cType”的声明
========== 生成:  成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

Red Hat Enterprise Linux Server release 6.4 (Santiago),gcc 版本 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC),编译报错如下

$ g++ test.cpp
test.cpp: In function ‘void protocolExchange(PROTOCOL_TYPE)’:
test.cpp:25: 错误:跳转至 case 标号
test.cpp:22: 错误:  跳过‘int cType’的初始化
test.cpp:28: 错误:跳转至 case 标号
test.cpp:22: 错误:  跳过‘int cType’的初始化
test.cpp:31: 错误:跳转至 case 标号
test.cpp:22: 错误:  跳过‘int cType’的初始化
test.cpp:34: 错误:跳转至 case 标号
test.cpp:22: 错误:  跳过‘int cType’的初始化
test.cpp:37: 错误:跳转至 case 标号
test.cpp:22: 错误:  跳过‘int cType’的初始化

错误原因为switch分支作用域问题。系统不允许我们在case中定义一个变量,原因是我们在一个case中定义的变量,假如在另一个case中被使用就会出现错误,因为一般来说switch语句中的case只能被执行一个,当然你也可以多个case合并(这个不是本篇博文重点,就不在此处赘述了)。如果想在case分支中使用临时变量,需要显示说明一下临时变量的作用域,在用到临时变量的case分支加上块作用域即可,也就是用“{}”括起来。建议我们在写case语句时给每一个case都加上“{}”,养成一个良好的编码习惯。

此处作为演示,仅给“UDP”分支添加块作用域,保证编译正确。

#if 1
#include <iostream>enum PROTOCOL_TYPE
{TCP = 0x00,UDP = 0x01,ARP = 0x10,HTTP = 0x11,FTP = 0x100,SSH = 0x101
};void protocolExchange(PROTOCOL_TYPE cType)
{switch (cType){case TCP:std::cout << "TCP协议" << std::endl;break;case UDP:{int cType = '1';std::cout << "UDP协议" << cType << std::endl;}break;case ARP:std::cout << "ARP协议" << std::endl;break;case HTTP:std::cout << "HTTP协议" << std::endl;break;case FTP:std::cout << "FTP协议" << std::endl;break;case SSH:std::cout << "SSH协议" << std::endl;break;default:std::cout << "未知协议" << std::endl;break;}
}int main(int argc, char **argv)
{protocolExchange(TCP);protocolExchange(UDP);return 0;
}#endif

编译通过,运行结果如下

【visual studio 2013】
TCP协议
UDP协议49
请按任意键继续. . .
【gcc 4.4.7】
$ g++ test.cpp
$ ./a.out
TCP协议
UDP协议49

好了,Demo演示到此结束,相信你对switch以及块作用域又有了新的认知。更多内容请关注博主分享的其他博文,相信你会有更多新的认知。好好学习,天天向上!

你真的了解switch吗?相关推荐

  1. 你真的懂switch吗?聊聊switch语句中的块级作用域

      最近在代码中不小心不规范的,在switch里面定义了块级变量,导致页面在某些浏览器中出错,本文讨论以下switch语句中的块级作用域. switch语句中的块级作用域 switch语句中的块级作用 ...

  2. 【Java基础篇】你真的懂switch语句吗?

    switch语句语法 switch (expression) {case value://语句break;//可选//可以有任意个case语句default://可选//语句} 注意点 switch的 ...

  3. c语言switch的作用域,你真的懂switch吗?聊聊switch语句中的块级作用域

    最近在代码中不小心不规范的,在switch里面定义了块级变量,导致页面在某些浏览器中出错,本文讨论以下switch语句中的块级作用域. switch语句中的块级作用域 switch语句中的块级作用域可 ...

  4. Scala Cookbook读书笔记 Chapter 3.Control Structures 第一部分

    3.0 总体介绍 Scala中的if/then/else结构和Java中很像,但是它还可以用来返回一个值.比如Java中用的三目运算,在Scala中只需要使用正常的if语句即可. val x = if ...

  5. 【Python】switch语法你真的懂吗

    对于从事数据科学和人工智能领域的人们来说,Python 是大家的首选编程语言.根据最近的一项调查,27% 的程序员开发职位要 求掌握 Python 语言,今年年初这一数字还只是 18.5%. Pyth ...

  6. 云计算时代,你真的懂 Docker 吗?

    要论云计算领域中,开发者需要具备哪些基本技能?那么 Docker 必是其一. 作为一个开源的应用容器引擎,Docker 能够让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行 ...

  7. 模型越大,真的越香吗?千亿参数之后是万亿,万亿之后呢?

    ‍ ‍ 智源导读:自2018年谷歌提出BERT模型以来,以BERT.GPT等为代表的模型越来越往「大」这一方向发展,短短3年时间,模型参数已经从最初3亿,扩张到万亿规模.与此同时,以T5.GPT-3等 ...

  8. 16000亿!谷歌发布人类历史首个万亿级模型 Switch Transformer,中国还有机会赶超吗?...

    新年伊始,大规模预训练模型军备竞赛进入万亿参数时代.  文:梦佳.周寅张皓.贾伟 近日,Google Brain的研究人员William Fedus.Barret Zoph.Noam Shazeer等 ...

  9. 《是男人就下100层》真的有隐藏剧情!B站up主数月破解,原作者点赞致谢

    边策 杨净 发自 凹非寺 量子位 报道 | 公众号 QbitAI <是男人就下100层>,曾经风靡一代的flash小游戏.炙手可热的休闲游戏之最. 它让多少人没日没夜地想去尝试" ...

最新文章

  1. 程序员笔记|如何编写优雅的Dockerfile
  2. 印度视觉设计师Rishab平面设计作品,简直太美了!
  3. WOJ 43 电话邀请
  4. Java反射,参数为数组
  5. (转) 使用vivado创建工程 1
  6. excel表格不够怎么添加_Excel表格水印,你以前好象添加错了!
  7. 简单技能之程序调试入门
  8. 设计模式系列之「装饰模式」
  9. 【每日算法Day 82】面试经典题:求第K大数,我写了11种实现,不来看看吗?
  10. Android 自定义View(一)常用属性
  11. windows无法访问共享文件 所有解决方法(非复制粘贴的烂大街处理方法)
  12. 日照分析的计算机精度,日照分析的部分参数详解
  13. npm run dev命令报错解决方式
  14. MySQL高手篇:精妙SQL语句介绍
  15. java 中subtract_Java.math.BigDecimal.subtract()方法实例
  16. 免费的网页原型制作工具
  17. 九月英语——梦开始的地方
  18. 火爆全网送给女朋友的微信每日多次消息推送程序来了!多版本多平台!
  19. struts2之token,类型转换和数据校验
  20. 【MES系统】这个表格让您秒懂MES制造执行系统与ERP企业管理系统的区别及联系

热门文章

  1. Unity3d之表情动画--眨眼
  2. PDF图纸怎么转成CAD?这个方法了解一下
  3. delphi 多线程3
  4. UVA10066 - The Twin Towers
  5. 关于OSPF中初始化、发现LSDB、交换LSA的描述
  6. 如何在交通事故中保障自己的安全
  7. 聪明的笨鸟(人-AI试验版)
  8. 怎样把纸质试卷扫描成电子版?纸质转电子版教程
  9. Ubuntu18.04将QT应用设计为开机自启
  10. 黑苹果win10双系统下文件名变灰色解决办法