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 ' ':
...



