switch 和 case 陳述式有助於控制複雜的條件作業和分支作業。
switch 陳述式會將控制權轉移到其主體中的陳述式。
語法
selection-statement:
switch ( expression ) statement
labeled-statement:
case constant-expression : statement
default : statement
備註
根據 switch 的值,labeled-statement 陳述式會導致控制項傳輸至在其陳述式主體中的一個 expression。
expression 和每個 constant-expression 的值都必須有整數類型。
constant-expression 在編譯時期必須具有明確的常數整數值。
控制項會傳遞至 case 值符合 constant-expression 值的 expression 陳述式。
switch 陳述式可以包含任何數量的 case 執行個體。 不過,相同的 constant-expression 陳述式內沒有任何兩個 switch 值可以有相同的值。
switch 陳述式主體的執行會從比對 labeled-statement 之後的第一個陳述式開始。 執行會繼續直到主體結束,或直到 break 陳述式將控制項傳輸出主體為止。
switch 陳述式的用法通常如下所示:
switch ( expression )
{
// declarations
// . . .
case constant_expression:
// statements executed if the expression equals the
// value of this constant_expression
break;
default:
// statements executed if expression does not equal
// any case constant_expression
}
您可以使用 break 陳述式結束處理 switch 陳述式內的特定標記陳述式。 它會分支至 switch 陳述式的結尾。 若沒有 break,程式會繼續到下一個標記陳述式,並且執行陳述式直到出現 break,或達到陳述式結尾為止。 在某些情況下,可能需要此接續。
如果沒有 defaultcase 值等於 constant-expression 的值,則會執行 expression 陳述式。 如果沒有 default 陳述式,而且找不到 case 相符專案,則不會執行 switch 主體中的陳述式。 最多可以有一個 default 陳述式。
default 陳述式不必在結尾。 它可能會出現在 switch 陳述式主體中的任何位置。
case 或 default 標籤只能出現在 switch 陳述式內。
switch
expression 和 caseconstant-expression 的類型必須是整數。 每個 caseconstant-expression 的值在陳述式主體中都必須是唯一的。
case 陳述式的 default 和 switch 標籤只有在決定從陳述式主體中的哪一個位置開始執行的初始測試中具有意義。
switch 陳述式可以是巢狀結構。 所有靜態變數都會在執行之前初始化為任何 switch 陳述式。
注意
宣告可以出現在形成 switch 主體的複合陳述式的開頭,但不會執行包含在宣告中的初始化。
switch 陳述式會將控制權直接轉移給主體中的可執行陳述式,並且略過包含初始化的程式行。
下列範例說明 switch 陳述式:
switch( c )
{
case 'A':
capital_a++;
case 'a':
letter_a++;
default :
total++;
}
如果 switch 等於 c,本範例中 'A' 主體的三個陳述式會全數執行,因為下列 break 之前不會顯示任何 case 陳述式。 執行控制權會轉移到第一個陳述式 (capital_a++;),並且依序繼續執行該主體的其餘部分。 如果 c 等於 'a',letter_a 和 total 會遞增。 當 total 不等於 c 或 'A' 時,只會遞增 'a'。
switch( i )
{
case -1:
n++;
break;
case 0 :
z++;
break;
case 1 :
p++;
break;
}
在此範例中,break 陳述式會接在 switch 主體的每個陳述式之後。
break 陳述式會在執行某個陳述式之後,強制從陳述式主體結束。 如果 i 等於 -1,則只有 n 會遞增。 陳述式 break 後面的 n++; 會導致將執行控制項傳遞到陳述式主體之外,並且略過剩餘的陳述式。 同樣地,如果,i 等於 0,只有 z 會遞增;如果 i 等於 1,只有 p 會遞增。 最終的 break 陳述式並非絕對必要,因為控制項會在複合陳述式的結尾傳遞到主體以外。 為了一致性而包含此陳述式。
如下列範例所示,單一陳述式可以多載多個 case 標籤:
switch( c )
{
case 'a' :
case 'b' :
case 'c' :
case 'd' :
case 'e' :
case 'f' : convert_hex(c);
}
在此範例中,如果 constant-expression 等於 'a' 與 'f' 之間的任何字母,則會呼叫 convert_hex 函式。
Microsoft 專有
Microsoft C 不會限制 case 陳述式中 switch 值的數量。 此數目會受到可用記憶體的限制。 ANSI C 要求在 case 陳述式中允許至少 257 個 switch 標籤。
Microsoft C 的 default 是已啟用 Microsoft 延伸模組。 使用 /Za 編譯器選項以停用這些延伸模組。