Files
2025-10-25 03:02:53 +03:00

115 lines
4.5 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[stmt.switch]
# 8 Statements [[stmt]](./#stmt)
## 8.5 Selection statements [[stmt.select]](stmt.select#stmt.switch)
### 8.5.3 The switch statement [stmt.switch]
[1](#1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/statements.tex#L444)
The switch statement causes control to be transferred to one of
several statements depending on the value of a condition[.](#1.sentence-1)
[2](#2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/statements.tex#L448)
If the [*condition*](stmt.pre#nt:condition "8.1Preamble[stmt.pre]") is an [*expression*](expr.comma#nt:expression "7.6.20Comma operator[expr.comma]"),
the value of the condition is the value of the [*expression*](expr.comma#nt:expression "7.6.20Comma operator[expr.comma]");
otherwise, it is the value of the decision variable[.](#2.sentence-1)
The value of the condition shall be of integral type, enumeration type, or class
type[.](#2.sentence-2)
If of class type, the
condition is [contextually implicitly converted](conv#def:contextually_implicitly_converted "7.3Standard conversions[conv]") to
an integral or enumeration type[.](#2.sentence-3)
If the (possibly converted) type is subject to [integral
promotions](conv.prom "7.3.7Integral promotions[conv.prom]"), the condition is converted
to the promoted type[.](#2.sentence-4)
Any
statement within the switch statement can be labeled with one or
more case labels as follows:
case [*constant-expression*](expr.const#nt:constant-expression "7.7Constant expressions[expr.const]") :
where the [*constant-expression*](expr.const#nt:constant-expression "7.7Constant expressions[expr.const]") shall be
a converted [constant expression](expr.const "7.7Constant expressions[expr.const]") of the
adjusted type of the switch condition[.](#2.sentence-5)
No two of the case constants in
the same switch shall have the same value after conversion[.](#2.sentence-6)
[3](#3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/statements.tex#L471)
There shall be at most one label of the formdefault : within a switch statement[.](#3.sentence-1)
[4](#4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/statements.tex#L479)
Switch statements can be nested; a case or default label
is associated with the smallest switch enclosing it[.](#4.sentence-1)
[5](#5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/statements.tex#L483)
When the switch statement is executed, its condition is
evaluated[.](#5.sentence-1)
If one of the case constants has the same value as the condition,
control is passed to the statement following the matched case label[.](#5.sentence-2)
If
no case constant matches the condition, and if there is adefault label, control passes to the statement labeled by the
default label[.](#5.sentence-3)
If no case matches and if there is no default then none of the statements in the switch is executed[.](#5.sentence-4)
[6](#6)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/statements.tex#L495)
case and default labels in themselves do not alter the
flow of control, which continues unimpeded across such labels[.](#6.sentence-1)
To exit
from a switch, see break, [[stmt.break]](stmt.break "8.8.2The break statement")[.](#6.sentence-2)
[*Note [1](#note-1)*:
Usually, the substatement that is the subject of a switch is compound
and case and default labels appear on the top-level
statements contained within the (compound) substatement, but this is not
required[.](#6.sentence-3)
Declarations can appear in the substatement of aswitch statement[.](#6.sentence-4)
— *end note*]
[7](#7)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/statements.tex#L509)
A switch statement of the form
switch ( [*init-statement*](stmt.pre#nt:init-statement "8.1Preamble[stmt.pre]") [*condition*](stmt.pre#nt:condition "8.1Preamble[stmt.pre]") ) [*statement*](stmt.pre#nt:statement "8.1Preamble[stmt.pre]")
is equivalent to
{
[*init-statement*](stmt.pre#nt:init-statement "8.1Preamble[stmt.pre]")
switch ( [*condition*](stmt.pre#nt:condition "8.1Preamble[stmt.pre]") ) [*statement*](stmt.pre#nt:statement "8.1Preamble[stmt.pre]")
}
except that the [*init-statement*](stmt.pre#nt:init-statement "8.1Preamble[stmt.pre]") is in
the same scope as the [*condition*](stmt.pre#nt:condition "8.1Preamble[stmt.pre]")[.](#7.sentence-1)