C语言的switch语句的控制流程能够依次通过并执行各个case部分,这一点是C语言与众不同之处。
C语言中switch语句的这种特性,既是它的优势所在,也是它的一大弱点。说它是一大弱点,是因为程序员很容易就会遗漏各个case部分的break语句,造成一些难以理解的程序行为。说它是优势所在,是因为如果程序员有意略去一个break语句,则可以表达出一些采用其他方式很难方便地加以实现的程序控制结构。特别是对于一些大的switch语句,我们常常会发现各个分支的处理大同小异:对某个分支情况的处理只要稍加改动,剩余部分就完全等同于另一个分支情况下的处理。
例如,考虑这样一个程序,它是某种假想的计算机的解释器(相当于虚拟机)。这个程序中包含有一个switch语句,用来处理每个不同的操作码。在这种假想的计算机上,只要将第二个操作数的正负号反号后,减法运算和加法运算的处理本质上是一样的。因此,如果我们可以像下面这样写代码,无疑会大大方便程序的处理:
case SUBTRACT: opnd2 = -opnd2; case ADD: …
当然,像不面的例子那样适当的程序注释是一个不错的做法。当其他人阅读到这段代码时,就能够了解到此处是有意省去一个break语句。
再看另一个例子,考虑这样一段代码,它的作用是一个编译器在查找符号时跳过程序中的空白字符。 这里,空格键、制表符和换行符的处理都是相同的,除了当遇到换行符时程序代码行计数器需要进行递增:
case ‘\n’: Linecount++; /*此处没有break语句*/ case ‘\t’: case ‘ ‘: …
未经允许不得转载:TacuLee » C陷阱与缺陷之switch语句