本文共 981 字,大约阅读时间需要 3 分钟。
疑问一、关于switch语句有哪些要注意的地方?
A1.default(如果有的话)可以出现在列表的任何位置,它在其他的case均无法匹配时被选中执行。(语句摘自《C专家编程》)
A2.在每个switch语句中都放上一条default语句是个好习惯,因为这样做可以检测到任何非法值。(语句摘自《C和指针》)
A3.switch default should never execute,simply assert.(摘自google c++编程规范)
——引申:养成把default语句放在最后的习惯,并在语句中加入assert(0)语句和printf+fflush信息用于调试。 但阅读代码时可能有程序员会把default语句放前面,这也有可能被执行,它是否被执行与default语句位置无关。
B.语句从匹配表达式的case开始执行。(语句摘自《C专家编程》)
——引申:不要在case之前加入语句,这些语句不会执行,但可以申明变量,不过最好也不要这么做,这些switch语句块作用域的变量声明和都要执行的语句最好放在swich语句之前,除非这些变量和语句只针对某种case。
C.switch的另一个问题是它内部的任何语句都可以加上标签,并在执行时跳转到那里,这就有可能破坏程序流的结构化。(语句摘自《C专家编程》)
——引申:若default这个词拼写错误,它会被误认为是标签,程序实际无法真正按照我们的想法进入相应的default语句。
D.fall through:它不会在每个标签后面的语句执行完毕后自动中止。一旦执行某个case语句,程序将会依次执行后面所有的case,除非遇到break语句。(语句摘自《C专家编程》,《C陷阱与缺陷》中也强调说明这一行为)
——引申:每个case结尾都优先加入break语句防止遗漏,实际编写时若有需要再删去。
良好的一个switch语句用法:
switch(character) { case 'A': ... // 语句 break; case 'B': ... // 语句 break; default: PRINTVALUE; // 语句,调试时输出值,其他情况下不执行(宏定义实现) assert(0); // 断言,调试时输出信息。}
转载地址:http://togab.baihongyu.com/