switch
statement (C++)
根據整數運算式的值,允許在多個程式碼區段中選取範圍。
語法
selection-statement
:
switch
(
init-statement
optC++17condition
)
statement
init-statement
:
expression-statement
simple-declaration
condition
:
expression
attribute-specifier-seq
optdecl-specifier-seq
declarator
brace-or-equal-initializer
labeled-statement
:
case
constant-expression
:
statement
default
:
statement
備註
語句 switch
會根據 的值,讓控制項在語句主體中傳送至其中一個 labeled-statement
condition
。
condition
必須有整數型別,或是具有明確轉換成整數型別的類別型別。 整數升階會如標準轉換 中所述 進行。
switch
語句主體包含一系列 case
標籤和一個 opt ional default
標籤。 labeled-statement
是下列其中一個標籤和下列語句。 加上標籤的語句不是語法需求,但 switch
語句沒有意義。 語句中 case
沒有任何兩 constant-expression
個值評估為相同的值。 卷 default
標只能顯示一次。 語句 default
通常會放在結尾,但它可以在語句主體中的任何 switch
位置出現。 case
或 default
標籤只能出現在 語句內 switch
。
constant-expression
每個 case
標籤中的 會轉換成與 相同類型的 condition
常數值。 然後,它與 condition
相等比較。 控制項會在 符合 的值 condition
之後 case
constant-expression
傳遞至第一個語句。 產生的行為如下表所示。
switch
語句行為
條件 | 動作 |
---|---|
轉換的值與升級之控制運算式的值相符。 | 控制權會轉移至標籤後面的陳述式。 |
沒有常數符合標籤中的 case 常數; default 標籤存在。 |
控制項會傳送至卷 default 標。 |
沒有常數符合標籤中的 case 常數;沒有 default 標籤存在。 |
控制項會在 語句之後 switch 傳送至 語句。 |
如果找到相符的運算式,則執行可以繼續進行更新版本 case
或 default
標籤。 break
語句是用來停止執行,並將控制權傳送至 語句之後的 switch
語句。 break
如果沒有 語句,則會執行從相符 case
標籤到 結尾 switch
的每個語句,包括 default
。 例如:
// switch_statement1.cpp
#include <stdio.h>
int main() {
const char *buffer = "Any character stream";
int uppercase_A, lowercase_a, other;
char c;
uppercase_A = lowercase_a = other = 0;
while ( c = *buffer++ ) // Walks buffer until NULL
{
switch ( c )
{
case 'A':
uppercase_A++;
break;
case 'a':
lowercase_a++;
break;
default:
other++;
}
}
printf_s( "\nUppercase A: %d\nLowercase a: %d\nTotal: %d\n",
uppercase_A, lowercase_a, (uppercase_A + lowercase_a + other) );
}
在上述範例中,如果 c
是上 'A'
case 層, uppercase_A
則會遞增。 結束 break
語句主體的執行 switch
後 uppercase_A++
,語句會傳遞至 while
迴圈。 break
如果沒有 語句,則執行會「落入」到下一個加上標籤的語句,如此 lowercase_a
一來,也會 other
遞增。 語句會 break
case 'a'
提供類似的用途。 如果 c
是較低的 case'a'
, lowercase_a
則會遞增,而 break
語句會終止語句主體 switch
。 如果 c
不是 'a'
或 'A'
,則會 default
執行 語句。
Visual Studio 2017 和更新版本 (適用于 /std:c++17
模式和更新版本):屬性 [[fallthrough]]
是在 C++17 標準中指定。 您可以在 語句中使用 switch
。 這是編譯器或任何讀取程式碼的人的提示,其行為是刻意的。 Microsoft C++ 編譯器目前不會在後置行為上發出警告,因此此屬性不會影響編譯器行為。 在此範例中,屬性會套用至未定標籤語句內的空白語句。 換句話說,需要分號。
int main()
{
int n = 5;
switch (n)
{
case 1:
a();
break;
case 2:
b();
d();
[[fallthrough]]; // I meant to do this!
case 3:
c();
break;
default:
d();
break;
}
return 0;
}
Visual Studio 2017 15.3 版和更新版本(適用于 /std:c++17
模式和更新版本 ):語句 switch
可能有一個 init-statement
子句,其結尾為分號。 它引進並初始化變數,其範圍僅限於 語句的 switch
區塊:
switch (Gadget gadget(args); auto s = gadget.get_status())
{
case status::good:
gadget.zip();
break;
case status::bad:
throw BadGadget();
};
語句的內部 switch
區塊可以包含具有初始化運算式的定義,只要這些 定義可 連線,即不會被所有可能的執行路徑略過。 使用這些宣告引入的名稱有區域範圍。 例如:
// switch_statement2.cpp
// C2360 expected
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
switch( tolower( *argv[1] ) )
{
// Error. Unreachable declaration.
char szChEntered[] = "Character entered was: ";
case 'a' :
{
// Declaration of szChEntered OK. Local scope.
char szChEntered[] = "Character entered was: ";
cout << szChEntered << "a\n";
}
break;
case 'b' :
// Value of szChEntered undefined.
cout << szChEntered << "b\n";
break;
default:
// Value of szChEntered undefined.
cout << szChEntered << "neither a nor b\n";
break;
}
}
switch
語句可以是巢狀的。 巢狀時, case
或 default
標籤會與括住它們的最接近 switch
語句產生關聯。
Microsoft 特定行為
Microsoft C++ 不會限制 語句中的 switch
值數目 case
。 此數目會受到可用記憶體的限制。
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應