C語言關鍵字淺析-case
阿新 • • 發佈:2018-11-12
### C語言關鍵字淺析系列 ###
### ISO/ANSI C 關鍵字 ###
case語句是C語言中switch開關語句中常用的關鍵字
將switch語句後的小括號中的變數視為引數
如果下面某一個case後跟的常量與引數相同
則從該case後的程式碼開始執行
case的作用:
標記switch選擇結構中程式開始執行的位置。
對比if-else關鍵字,case關鍵字的一大優勢是可以按“開關”的思想控制語句開始執行的位置。
但case的一個劣勢是,case後的引數需要是int或者char常量,不能是表示式,而if-else可以根據表示式結果判斷執行。
/* 轉換地址,不區分大小寫 */ int alterAddress(char c) { int add; switch(c) { case 'a': /* 如果引數c是'a',程式從此處開始執行 */ case 'A': /* 如果引數c是'A',程式從此處開始執行 */ add = 0x11; break; /* 為了遮蔽其他選項,發揮switch的選擇功能,一類處理的最後要寫上break跳過後面的執行語句 */ case 'b': case 'B': add = 0x12; break; case 'c': case 'C': add = 0x13; /* 此處有bug,沒有break會導致後面的語句繼續執行,也許會造成程式結果錯誤 */ case 'd': case 'D': add = 0x14; default: add = 0x01; } return add; }
case語句和if-else語句的另一個不同之處在於,case語句都在同一個作用域,case後定義變數可能會出錯,比如下面這個例子:
int j;
switch(c)
{
case 'a':
int i; /* 這裡編譯器可能會報錯,因為所有的case在一個作用域,這個i在所有case都可見 */
i = 0;
case 'b':
case 'c':
j = 2;
break;
}
解決方案是,用一個{}在case後巢狀一個程式碼塊,強行做一個作用域:
int j; switch(c) { case 'a': { int i; /* 用大括號圍成一個程式碼塊,i的作用域就限定在了該程式碼塊內 */ i = 0; } case 'b': case 'c': j = 2; break; }
——參考《C Primer Plus第五版》