< cpp‎ | language
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Function declaration
Lambda function declaration
inline specifier
Exception specifications (until C++20)
noexcept specifier (C++11)
decltype (C++11)
auto (C++11)
alignas (C++11)
Storage duration specifiers
Alternative representations
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Attributes (C++11)
typedef declaration
Type alias declaration (C++11)
Implicit conversions - Explicit conversions
static_cast - dynamic_cast
const_cast - reinterpret_cast
Memory allocation
Class-specific function properties
Special member functions
label : statement
Expression statements
expression ;
Compound statements
{ statement... }
Selection statements
Iteration statements
range for(C++11)
Jump statements
Declaration statements
declaration ;
Try blocks
try compound-statement handler-sequence
Transactional memory
synchronized, atomic_commit, etc(TM TS)

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:

1) expression statements;
2) compound statements;
3) selection statements;
4) iteration statements;
5) jump statements;
6) declaration statements;
7) try blocks;
8) atomic and synchronized blocks (TM TS).


[edit] Labels

Any statement can be labeled, by providing a label followed by a colon before the statement itself.

attr(optional) identifier : statement (1)
attr(optional) case constexpr : statement (2)
attr(optional) default : statement (3)
1) target for goto;
2) case label in a switch statement;
3) default label in a switch statement.

An attribute sequence attr may appear just before 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. A statement may carry multiple labels.

A label (and only a label) with an identifier declared inside a function is in scope everywhere in that function, in all nested blocks, before and after its own declaration.

Two labels in a function must not have the same identifier.

Labels are not found by unqualified lookup: a label can have the same name as any other entity in the program.

void f()
       goto label; // label in scope even though declared later
   goto label; // label ignores block scope
void g()
    goto label; // error: label not in scope in g()

[edit] Expression statements

An expression followed by a semicolon is a statement.

attr(optional) expression(optional) ; (1)
attr(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.

[edit] Compound statements

Compound statements or blocks are brace-enclosed sequences of statements.

attr(optional) { statement...(optional) } (1)

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 block
        std::ofstream f("test.txt"); // declaration statement
        f << "abc\n";                // expression statement
    }                                // end of block: f is flushed and closed
    std::ifstream f("test.txt"); 
    std::string str;
    f >> str; 

[edit] Selection statements

Selection statements choose between one of several flows of control.

attr(optional) if ( condition ) statement (1)
attr(optional) if ( condition ) statement else statement (2)
attr(optional) switch ( condition ) statement (3)
(until C++17)
attr(optional) if constexpr(optional) ( init-statement(optional) condition ) statement (1)
attr(optional) if constexpr(optional) ( init-statement(optional) condition ) statement else statement (2)
attr(optional) switch ( init-statement(optional) condition ) statement (3)
(since C++17)
1) if statement;
2) if statement with an else clause;
3) switch statement.

[edit] Iteration statements

Iteration statements repeatedly execute 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 ( for-range-decl : for-range-init ) statement (4) (since C++11)
1) while loop;
2) do-while loop;
3) for loop;
4) range for loop.

[edit] Jump statements

Jump statements unconditionally transfer flow control

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)
1) break statement;
2) continue statement;
3) return statement with an optional expression;
4) return statement using list initialization;
5) goto statement.

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.

[edit] Declaration statements

Declaration statements introduce one or more identifiers into a block.

block-declaration (1)
1) see Declarations and Initialization for details.

[edit] Try blocks

Try blocks provide the ability to catch exceptions thrown when executing other statements.

attr(optional) try compound-statement handler-sequence (1)
1) see try/catch for details.

Atomic and synchronized blocks

Atomic and synchronized blocks are used to implement transactional memory.

synchronized compound-statement (1) (TM TS)
atomic_noexcept compound-statement (2) (TM TS)
atomic_cancel compound-statement (3) (TM TS)
atomic_commit compound-statement (4) (TM TS)
1) synchronized block, executed in single total order with all synchronized blocks;
2) atomic block that aborts on exceptions;
3) atomic block that rolls back on exceptions;
4) atomic block that commits on exceptions.

[edit] See also

C documentation for Statements