Statements
Statements are fragments of the C++ program that are executed in sequence. The body of any function is a sequence of statements. For example:
int main()
{
int n = 1; // declaration statement
n = n + 1; // expression statement
std::cout << "n = " << n << '\n'; // expression statement
return 0; // return statement
}
C++ includes the following types of statements:
- Labeled statements
- Expression statements
- Compound statements
- Selection statements
- Iteration statements
| (since C++26) |
| (since C++26) |
| (TM TS) |
Labeled statements
A labeled statement labels a statement for control flow purposes.
| label statement |
| label | - | the label applied to the statement (defined below) |
| statement | - | the statement which the label applies to, it can be a labeled statement itself, allowing multiple labels |
Labels
label is defined as
attr (optional) identifier : | (1) | |
attr (optional) case constexpr : | (2) | |
attr (optional) default: | (3) |
Two identifier labels in a function must not have the same identifier . identifier s in labels are not found by unqualified lookup: a label can have the same name as any other entity in the program.
case labels and default labels must be enclosed by switch statements.
| An attribute sequence attr may appear just at the beginning of the label (in which case it applies to the label), or just before any statement itself, in which case it applies to the entire statement. | (since C++11) |
| Besides being added to a statement, labels can also be used anywhere in compound statements. | (since C++23) |
| Identifier labels must not be enclosed by expansion statements. | (since C++26) |
void f()
{
label1: 1 + 1; // a labeled statement
label1: 1 - 1; // Error: cannot repeat label identifiers in the same function
label2: // label can appear at the end of a block standalone since C++23
}
Control-flow-limited statements
The following statements are control-flow-limited statements :
| (since C++17) |
| (since C++23) |
For each control-flow-limited statement S:
- All goto target labels delcared in
Scan only be referred to by statements inS. - Each case or default label appearing within
Scan only be associated with a switch statement withinS.
Expression statements
An expression statement is an expression followed by a semicolon.
attr (optional) expression (optional) ; |
| attr | - | (since C++11) optional sequence of any number of attributes |
| expression | - | an expression |
Most statements in a typical C++ program are expression statements, such as assignments or function calls.
An expression statement without an expression is called a null statement. It is often used to provide an empty body to a for or while loop. It can also be used to carry a label in the end of a compound statement.(until C++23)
Compound statements
A compound statement or block groups a sequence of statements into a single statement.
attr (optional) { statement... (optional) label... (optional)(since C++23) } |
When one statement is expected, but multiple statements need to be executed in sequence (for example, in an if statement or a loop), a compound statement may be used:
if (x > 5) // start of if statement
{ // start of block
int n = 1; // declaration statement
std::cout << n; // expression statement
} // end of block, end of if statement
Each compound statement introduces its own block scope; variables declared inside a block are destroyed at the closing brace in reverse order:
int main()
{ // start of outer block
{ // start of inner block
std::ofstream f("test.txt"); // declaration statement
f << "abc\n"; // expression statement
} // end of inner block, f is flushed and closed
std::ifstream f("test.txt"); // declaration statement
std::string str; // declaration statement
f >> str; // expression statement
} // end of outer block, str is destroyed, f is closed
| A label at the end of a compound statement is treated as if it were followed by a null statement. | (since C++23) |
Selection statements
A selection statement chooses between one of several control flows.
attr (optional) if constexpr(optional) ( init-statement (optional) condition ) statement | (1) | |
attr (optional) if constexpr(optional) ( init-statement (optional) condition ) statementelse statement | (2) | |
attr (optional) switch ( init-statement (optional) condition ) statement | (3) | |
attr (optional) if !(optional) consteval compound-statement | (4) | (since C++23) |
attr (optional) if !(optional) consteval compound-statement else statement | (5) | (since C++23) |
Iteration statements
An iteration statement repeatedly executes some code.
attr (optional) while ( condition ) statement | (1) | |
attr (optional) do statement while ( expression ) ; | (2) | |
attr (optional) for ( init-statement condition (optional) ; expression (optional) ) statement | (3) | |
attr (optional) for( init-statement (optional)(since C++20) range-decl : range-init ) statement | (4) | (since C++11) |
Expansion statementsAn expansion statement replaces some code with multiple copies.
| (since C++26) |
Jump statements
A jump statement unconditionally transfers control flow.
attr (optional) break; | (1) | |
attr (optional) continue; | (2) | |
attr (optional) return expression (optional) ; | (3) | |
attr (optional) return braced-init-list ; | (4) | (since C++11) |
attr (optional) goto identifier ; | (5) |
Note: for all jump statements, transfer out of a loop, out of a block, or back past an initialized variable with automatic storage duration involves the destruction of objects with automatic storage duration that are in scope at the point transferred from but not at the point transferred to. If multiple objects were initialized, the order of destruction is the opposite of the order of initialization.
Assertion statementsA contract assertion.
| (since C++26) |
Declaration statements
A declaration statement introduces one or more identifiers into a block.
| block-declaration | (1) |
try blocks
A try block catches exceptions thrown when executing other statements.
attr (optional) try compound-statement handler-sequence | (1) |
Atomic and synchronized blocksAn atomic and synchronized block provides transactional memory.
| (TM TS) |
Substatements
A substatement of a statement is one of the following:
- For a labeled statement, its statement .
- For a compound statement, any statement of its statement... .
- For a selection statement, any of its statement or compound-statement (since C++23).
- For an iteration statement, its statement .
| (since C++26) |
A statement S1 encloses a statement S2 if any of the following conditions is satisfied:
-
S2is a substatement ofS1 -
S1is a selection statement, expansion statement(since C++26) or iteration statement, andS2is the init-statement ofS1. -
S1is a try block, andS2is either its compound-statement or the compound-statement of any handler in its handler-seq . -
S1encloses a statementS3andS3enclosesS2.
A statement S1 is enclosed by a statement S2 if S2 encloses S1.
See also
| C documentation for Statements |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/language/statements