栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C陷阱与缺陷 第2章 词法“陷阱” 2.4 switch语句

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C陷阱与缺陷 第2章 词法“陷阱” 2.4 switch语句

switch 语句
C语言的switch语句的控制流程能够依次通过并执行各个case部分,这一点是C语言的与众不同之处。 
两段程序分别用C语言和Pascal语句编写: 
switch(color) {
    case 1: printf("red");
    break;
    case 2: printf("yellow");
    break;
    case 3: printf("blue");
    break;
}
switch(color) {
    case 1: printf("red");
    case 2: printf("yellow");
    case 3: printf("blue");
}
两段代码要完成的是同样的任务。根据变量color的值(1、2或3),分别打印出red、yellow或blue。只有一种例外情况:那就是用Pascal语言编写的程序段中每个case部分并没有C语言的break语句对应的部分。之所以会这样,是因为C语言中把case标号当做真正意义上的标号,因此程序的控制流会径直通过case标号,而不会收到任何影响。而在Pascal中,每个case标号会隐含地结束了前一个case部分。

用C语言编写以下程序 
switch(color) {
    case 1: printf("red");
    case 2: printf("yellow");
    case 3: printf("blue");
}
又进一步假定变量color的值为2.最后,程序将会打印出
yellowblue
因为程序的控制流程在执行了第二个printf函数的调用之后,会自然而然地顺序执行下去,所以第三个printf函数调用也会被执行。

C语言中的switch语句的这种特性,既是它的优势所在,也是它的一大弱点。说它是一大弱点,是因为程序员很容易遗漏各个case部分的break语句,造成一些难以理解的问题。说它是优势所在,是因为如果程序要有意省略去一个break语句,则可以表达出一些采用其他方式很难方便地加以实现的程序控制结构。特别是对于一些大的switch语句,我们常常会发现各个分支的处理大同小异:对某个分支稍作改动,剩余部分就完全等同于另一个分支情况下的处理。 

程序有一个switch语句,用来处理每个不同的操作码。在这种假想的计算机上,只要将第二个操作数的正负号反号后,减法运算和加法运算本质上就是一样的。 
case SUBTRACT:
    opnd2 = -opnd2;
    
case ADD:
    ...
当然,像上面的例子添加适当的注释是一种不错的做法。能够让阅读这段代码的人知道此处是有意省去了一个break语句。 

它的作用是一个编译器查找符号时跳过程序中的空白字符。这里,空格键、制表符和换行符的处理都是相同的,不过在遇到换行符时,程序的代码行计数要进行递增: 
case 'n':
    linecount++;
    
case 't':
case ' ':
    ... 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1018450.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号