switch statement (C++)

根據整數運算式的值,允許在多個程式碼區段中選取範圍。

語法

selection-statement
switch(init-statementoptC++17condition)statement

init-statement
expression-statement
simple-declaration

condition
expression
attribute-specifier-seqopt decl-specifier-seq declarator brace-or-equal-initializer

labeled-statement
case constant-expression : statement
default : statement

備註

語句 switch 會根據 的值,讓控制項在語句主體中傳送至其中一個 labeled-statementcondition

condition必須有整數型別,或是具有明確轉換成整數型別的類別型別。 整數升階會如標準轉換 中所述 進行。

switch語句主體包含一系列 case 標籤和一個 opt ional default 標籤。 labeled-statement是下列其中一個標籤和下列語句。 加上標籤的語句不是語法需求,但 switch 語句沒有意義。 語句中 case 沒有任何兩 constant-expression 個值評估為相同的值。 卷 default 標只能顯示一次。 語句 default 通常會放在結尾,但它可以在語句主體中的任何 switch 位置出現。 casedefault 標籤只能出現在 語句內 switch

constant-expression每個 case 標籤中的 會轉換成與 相同類型的 condition 常數值。 然後,它與 condition 相等比較。 控制項會在 符合 的值 condition 之後 caseconstant-expression 傳遞至第一個語句。 產生的行為如下表所示。

switch 語句行為

條件 動作
轉換的值與升級之控制運算式的值相符。 控制權會轉移至標籤後面的陳述式。
沒有常數符合標籤中的 case 常數; default 標籤存在。 控制項會傳送至卷 default 標。
沒有常數符合標籤中的 case 常數;沒有 default 標籤存在。 控制項會在 語句之後 switch 傳送至 語句。

如果找到相符的運算式,則執行可以繼續進行更新版本 casedefault 標籤。 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 語句主體的執行 switchuppercase_A++ ,語句會傳遞至 while 迴圈。 break如果沒有 語句,則執行會「落入」到下一個加上標籤的語句,如此 lowercase_a 一來,也會 other 遞增。 語句會 breakcase '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語句可以是巢狀的。 巢狀時, casedefault 標籤會與括住它們的最接近 switch 語句產生關聯。

Microsoft 特定行為

Microsoft C++ 不會限制 語句中的 switch 值數目 case 。 此數目會受到可用記憶體的限制。

另請參閱

選取範圍陳述式
關鍵字