现在的位置: 首页 > 综合 > 正文

C语言注意事项——switch语句

2019年07月17日 ⁄ 综合 ⁄ 共 968字 ⁄ 字号 评论关闭

疑问一、关于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语句用法:
<div><pre name="code" class="cpp">switch(character) {
  case 'A':
    ... // 语句
    break;
  case 'B':
    ... // 语句
    break;
  default:
    PRINTVALUE;  // 语句,调试时输出值,其他情况下不执行(宏定义实现)
    assert(0);  // 断言,调试时输出信息。
}

抱歉!评论已关闭.