Namespaces
Variants
Views
Actions

Difference between revisions of "cpp/language/switch"

From cppreference.com
< cpp‎ | language
m (contextually implicitly convertible)
m (mention nested. seealso c)
Line 28: Line 28:
  
 
===Explanation===
 
===Explanation===
The body of a switch statement may have an arbitrary number of {{tt|case:}} labels, as long as the values of all {{spar|constant_expressions}} are unique (after conversions/promotions).
+
The body of a switch statement may have an arbitrary number of {{tt|case:}} labels, as long as the values of all {{spar|constant_expressions}} are unique (after conversions/promotions). At most one {{tt|default:}} label may be present (although nested switch statements may use their own {{tt|default:}} labels or have {{tt|case:}} labels whose constants are identical to the ones used in the enclosing switch)
  
 
If {{spar|condition}} evaluates to the value that is equal to the value of one of {{spar|constant_expression}}s, then control is transferred to the statement that is labeled with that {{spar|constant_expression}}.
 
If {{spar|condition}} evaluates to the value that is equal to the value of one of {{spar|constant_expression}}s, then control is transferred to the statement that is labeled with that {{spar|constant_expression}}.
Line 139: Line 139:
 
1
 
1
 
}}
 
}}
 +
 +
===See also===
 +
{{dsc begin}}
 +
{{dsc see c | c/language/switch}}
 +
{{dsc end}}
 +
  
 
[[de:cpp/language/switch]]
 
[[de:cpp/language/switch]]

Revision as of 07:10, 26 December 2014

 
 
C++ language
General topics
Flow control
Conditional execution statements
if
switch
Iteration statements (loops)
for
range-for (C++11)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications (until C++17*)
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
explicit (C++11)
static

Special member functions
Templates
Miscellaneous
 
 

Transfers control to one of the several statements, depending on the value of a condition.

Contents

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:

switch(1) {
    case 1 : cout << '1'; // prints "1",
    case 2 : cout << '2'; // then prints "2"
}
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:

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

switch, case, default

Example

The following code shows several usage cases of the switch statement

#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:

2345
d
red
1

See also

C documentation for switch