Transfers control to one of the several statements, depending on the value of a condition.
Syntax
attr(optional) switch ( condition ) statement |
attr(C++11) | - | any number of attributes |
condition | - | any expression of integral or enumeration type, or of a class type contextually implicitly convertible to an integral or enumeration type, or a declaration of a single non-array variable of such type with a brace-or-equals initializer. |
statement | - | any statement (typically a compound statement). case: and default: labels are permitted in statement and break; statement has special meaning. |
attr(optional) case constant_expression : statement | (1) | |
attr(optional) default : statement | (2) |
constant_expression | - | a constant expression of the same type as the type of condition after conversions and integral promotions |
Explanation
The body of a switch statement may have an arbitrary number of case:
labels, as long as the values of all constant_expressions are unique (after conversions/promotions). At most one default:
label may be present (although nested switch statements may use their own default:
labels or have case:
labels whose constants are identical to the ones used in the enclosing switch).
If condition evaluates to the value that is equal to the value of one of constant_expressions, then control is transferred to the statement that is labeled with that constant_expression.
If condition evaluates to the value that doesn't match any of the case:
labels, and the default:
label is present, control is transferred to the statement labeled with the default:
label.
The break statement, when encountered in statement exits the switch statement:
1 2 3 4 | switch (1) { case 1 : cout << '1' ; // prints "1", case 2 : cout << '2' ; // then prints "2" } |
1 2 3 4 5 6 | switch (1) { case 1 : cout << '1' ; // prints "1" break ; // and exits the switch case 2 : cout << '2' ; break ; } |
Because transfer of control is not permitted to enter the scope of a variable, if a declaration statement is encountered inside the statement, it has to be scoped in its own compound statement:
1 2 3 4 5 6 7 8 9 | switch (1) { case 1: int x = 0; // initialization std::cout << x << '\n' ; break ; default : // compilation error: jump to default: would enter the scope of 'x' // without initializing it std::cout << "default\n" ; break ; } |
1 2 3 4 5 6 7 8 | switch (1) { case 1: { int x = 0; std::cout << x << '\n' ; break ; } // scope of 'x' ends here default : std::cout << "default\n" ; // no error break ; } |
Keywords
Example
The following code shows several usage cases of the switch statement.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | #include <iostream> int main() { int i = 2; switch (i) { case 1: std::cout << "1" ; case 2: std::cout << "2" ; //execution starts at this case label case 3: std::cout << "3" ; case 4: case 5: std::cout << "45" ; break ; //execution of subsequent statements is terminated case 6: std::cout << "6" ; } std::cout << '\n' ; switch (i) { case 4: std::cout << "a" ; default : std::cout << "d" ; //there are no applicable constant_expressions //therefore default is executed } std::cout << '\n' ; switch (i) { case 4: std::cout << "a" ; //nothing is executed } // when enumerations are used in a switch statement, many compilers // issue warnings if one of the enumerators is not handled enum color {RED, GREEN, BLUE}; switch (RED) { case RED: std::cout << "red\n" ; break ; case GREEN: std::cout << "green\n" ; break ; case BLUE: std::cout << "blue\n" ; break ; } // pathological examples // the statement doesn't have to be a compound statement switch (0) std::cout << "this does nothing\n" ; // labels don't require a compound statement either switch ( int n = 1) case 0: case 1: std::cout << n << '\n' ; // Duff's Device: http://en.wikipedia.org/wiki/Duff's_device } |
Output:
1 2 3 4 | 2345 d red 1 |
See also
C documentation for switch |
Please login to continue.