switch ステートメント (C++)switch Statement (C++)

整数式の値に応じてコードの複数のセクション間を切り替えます。Allows selection among multiple sections of code, depending on the value of an integral expression.

構文Syntax

   switch ( init; expression )
   case constant-expression : statement
   [default  : statement]

RemarksRemarks

または整数型への明確な変換がある対象のクラス型の整数型にする必要があります。The expression must be of an integral type or of a class type for which there is an unambiguous conversion to integral type. 」の説明に従って、整数の上位変換が実行される標準変換します。Integral promotion is performed as described in Standard Conversions.

切り替えるステートメント本体内から成る、一連のケースラベルと省略可能な既定ラベル。The switch statement body consists of a series of case labels and an optional default label. 2 つの定数式でケースステートメントが同じ値に評価されることができません。No two constant expressions in case statements can evaluate to the same value. 既定ラベルは 1 回だけ出現できます。The default label can appear only once. ラベル付きステートメントは構文上の要件ではありませんが、切り替えるステートメントはせずに意味がありません。The labeled statements are not syntactic requirements, but the switch statement is meaningless without them. default ステートメントを最後に記述する必要はありません。switch ステートメントの本体内の任意の場所で使用できます。The default statement need not come at the end; it can appear anywhere in the body of the switch statement. case ラベルまたは default ラベルは、switch ステートメント内でのみ使用できます。A case or default label can only appear inside a switch statement.

定数式ケースラベルがの型に変換されたと比較の等しいかどうか。The constant-expression in each case label is converted to the type of expression and compared with expression for equality. コントロールがあるステートメントに移りますケース 定数式 の値と一致する します。Control passes to the statement whose case constant-expression matches the value of expression. 結果の動作を次の表に示します。The resulting behavior is shown in the following table.

switch ステートメントの動作Switch Statement Behavior

条件Condition アクションAction
変換後の値は、上位変換された制御式の値と一致します。Converted value matches that of the promoted controlling expression. 制御は、そのラベルの次のステートメントに移ります。Control is transferred to the statement following that label.
含まれている定数に一致、定数のいずれも、ケースラベル、既定ラベルが存在します。None of the constants match the constants in the case labels; a default label is present. 制御が移ります、既定ラベル。Control is transferred to the default label.
含まれている定数に一致、定数のいずれも、ケースラベル。既定ラベルが存在しません。None of the constants match the constants in the case labels; default label is not present. 後のステートメントに制御が移ります、切り替えるステートメント。Control is transferred to the statement after the switch statement.

コントロールがそれ以降によって妨げられるいない一致する式が見つかった場合ケースまたは既定ラベル。If a matching expression is found, control is not impeded by subsequent case or default labels. Breakステートメントが実行を停止し、後のステートメントに制御を転送するために使用、切り替えるステートメント。The break statement is used to stop execution and transfer control to the statement after the switch statement. なし、 breakステートメントでは、すべてのステートメントから、一致するケースの末尾にラベル、切り替えるなど、既定は実行されます。Without a break statement, every statement from the matched case label to the end of the switch, including the default, is executed. 例:For example:

// switch_statement1.cpp
#include <stdio.h>

int main() {
   char *buffer = "Any character stream";
   int capa, lettera, nota;
   char c;
   capa = lettera = nota = 0;

   while ( c = *buffer++ )   // Walks buffer until NULL
   {
      switch ( c )
      {
         case 'A':
            capa++;
            break;
         case 'a':
            lettera++;
            break;
         default:
            nota++;
      }
   }
   printf_s( "\nUppercase a: %d\nLowercase a: %d\nTotal: %d\n",
      capa, lettera, (capa + lettera + nota) );
}

上の例では、capac が大文字 A の場合、インクリメントします。In the above example, capa is incremented if c is an uppercase A. Break後のステートメントcapa++の実行を終了、スイッチをステートメント本体と制御を渡します、ループします。The break statement after capa++ terminates execution of the switch statement body and control passes to the while loop. なし、 breakステートメントでは、実行は「フォール スルー」[次へ] のラベル付きステートメントにようにletteranotaもインクリメントされます。Without the break statement, execution would "fall through" to the next labeled statement, so that lettera and nota would also be incremented. 目的は同じですが、によって処理される、 breakステートメントcase 'a'A similar purpose is served by the break statement for case 'a'. 場合cが小文字aletteraがインクリメントされます、 breakステートメントが終了、切り替えるステートメント本体。If c is a lowercase a, lettera is incremented and the break statement terminates the switch statement body. 場合cでない、aまたはA既定ステートメントが実行されます。If c is not an a or A, the default statement is executed.

Visual Studio 2017 以降: (で使用可能な/std:c + + + 17)、[[fallthrough]]標準の c++ 17 で属性を指定します。Visual Studio 2017 and later: (available with /std:c++17) The [[fallthrough]] attribute is specified in the C++17 standard. 使用できます、切り替えるステートメントは、フォールスルー動作を意図 (または、コードを読むすべてのユーザーに) コンパイラにヒントとして。It can be used in a switch statement as a hint to the compiler (or to anyone reading the code) that fall-through behavior is intended. MicrosoftC++コンパイラ現在は、警告、fallthrough 動作のため、この属性はコンパイラの動作に影響を与えません。The Microsoft C++ compiler currently does not warn on fallthrough behavior, so this attribute has no effect on compiler behavior. 属性をラベル付きステートメント内で空のステートメントに適用されるに注意してください。つまり、セミコロンは必要があります。Note that the attribute is applied to an empty statement within the labeled statement; in other words the semicolon is necessary.

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 ステートメントは、紹介し、スコープは、switch ステートメントのブロックに限定する変数を初期化することがあります。Visual Studio 2017 version 15.3 and later (available with /std:c++17): A switch statement may introduce and initialize a variable whose scope is limited to the block of the switch statement:

    switch (Gadget gadget(args); auto s = gadget.get_status())
    {
    case status::good:
        gadget.zip();
        break;
    case status::bad:
        throw BadGadget();
    };

内側のブロックを切り替えるが到達可能な限り、ステートメントで初期化の定義を含めることができます: ないは、すべての実行可能なパスではバイパスされます。An inner block of a switch statement can contain definitions with initializations as long as they are reachable — that is, not bypassed by all possible execution paths. これらの宣言を使用して導入された名前にはローカル スコープがあります。Names introduced using these declarations have local scope. 例:For example:

// 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;
    }
}

A切り替えるステートメントは入れ子にできます。A switch statement can be nested. このような場合、ケースまたは既定ラベルは、最も近いと関連付ける切り替えるそのすぐ外側のステートメント。In such cases, case or default labels associate with the closest switch statement that encloses them.

Microsoft 固有の仕様Microsoft Specific

Microsoft C では、case 値の数は制限されませんが、切り替えるステートメント。Microsoft C does not limit the number of case values in a switch statement. この数は、使用できるメモリによってのみ制限されます。The number is limited only by the available memory. ANSI C には、少なくとも 257 が必要がありますの case ラベルを使用できる、切り替えるステートメント。ANSI C requires at least 257 case labels be allowed in a switch statement.

Microsoft C の既定では、Microsoft 拡張機能が有効になっています。The default for Microsoft C is that the Microsoft extensions are enabled. 使用して、 /Zaコンパイラ オプションは、これらの拡張機能を無効にします。Use the /Za compiler option to disable these extensions.

Microsoft 固有の仕様はここまでEND Microsoft Specific

関連項目See also

選択ステートメントSelection Statements
キーワードKeywords