4. switch語句

switch語句可以產生具有多個分支的控制流程。它的格式是:

switch (控製表達式) {
case 常量表達式: 語句列表
case 常量表達式: 語句列表
...
default: 語句列表
}

例如以下程序根據傳入的參數1~7分別打印Monday~Sunday:

例 4.1. switch語句


如果傳入的參數是2,則從case 2分支開始執行,先是打印相應的信息,然後遇到break語句,它的作用是跳出整個switch語句塊。C語言規定各case分支的常量表達式必須互不相同,如果控製表達式不等於任何一個常量表達式,則從default分支開始執行,通常把default分支寫在最後,但不是必須的。使用switch語句要注意幾點:

  1. case後面跟表達式的必須是常量表達式,這個值和全局變數的初始值一樣必須在編譯時計算出來。

  2. 第 2 節 “if/else語句”講過浮點型不適合做精確比較,所以C語言規定case後面跟的必須是整型常量表達式。

  3. 進入case後如果沒有遇到break語句就會一直往下執行,後面其它casedefault分支的語句也會被執行到,直到遇到break,或者執行到整個switch語句塊的末尾。通常每個case後面都要加上break語句,但有時會故意不加break來利用這個特性,例如:

    例 4.2. 缺break的switch語句


switch語句不是必不可缺的,顯然可以用一組if ... else if ... else if ... else ...代替,但是一方面用switch語句會使代碼更清晰,另一方面,有時候編譯器會對switch語句進行整體優化,使它比等價的if/else語句所生成的指令效率更高。