Namespaces
Variants
Views
Actions

Difference between revisions of "cpp/language/statements"

From cppreference.com
< cpp‎ | language
m (rv return statement)
(loop and block were correct. plural was correct)
Line 2: Line 2:
 
{{cpp/language/statements/navbar}}
 
{{cpp/language/statements/navbar}}
 
Statements are fragments of the C++ program that are executed in sequence. The body of any function is a sequence of statements. For example:
 
Statements are fragments of the C++ program that are executed in sequence. The body of any function is a sequence of statements. For example:
 +
 
{{source|1=
 
{{source|1=
 
int main()
 
int main()
Line 11: Line 12:
 
}   
 
}   
 
}}
 
}}
 +
  
 
There are seven types of statements:
 
There are seven types of statements:
@1@ expression statement;
+
 
@2@ compound statement;
+
@1@ expression statements;
@3@ selection statement;
+
@2@ compound statements;
@4@ iteration statement;
+
@3@ selection statements;
@5@ jump statement;
+
@4@ iteration statements;
@6@ declaration statement;
+
@5@ jump statements;
@7@ try block.
+
@6@ declaration statements;
 +
@7@ try blocks.
  
 
===Labels===
 
===Labels===
A ''labeled statement'' is a label followed by a colon before the statement itself.
+
Any statement can be ''labeled'', by providing a label followed by a colon before the statement itself:
 +
 
 
{{sdsc begin}}
 
{{sdsc begin}}
 
{{sdsc|num=1|1=
 
{{sdsc|num=1|1=
Line 34: Line 38:
 
}}
 
}}
 
{{sdsc end}}
 
{{sdsc end}}
@1@ target for {{rlp|goto}};
+
@1@ target for {{rlp|goto}}.
@2@ case label in a {{rlp|switch}} statement;
+
@2@ case label in a {{rlp|switch}} statement.
 
@3@ default label in a {{rlp|switch}} statement.
 
@3@ default label in a {{rlp|switch}} statement.
  
Line 41: Line 45:
  
 
===Expression statements===
 
===Expression statements===
An ''expression statement'' is an expression followed by a semicolon.
+
An expression followed by a semicolon is a statement.
 +
 
 
{{sdsc begin}}
 
{{sdsc begin}}
 
{{sdsc|num=1|1=
 
{{sdsc|num=1|1=
Line 55: Line 60:
 
Most statements in a typical C++ program are expression statements, such as assignments or function calls.
 
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 {{rlp|for}} or {{rlp|while}} statement. It can also be used to carry a label in the end of a compound statement.
+
An expression statement without an expression is called a ''null statement''. It is often used to provide an empty body to a {{rlp|for}} or {{rlp|while}} loop. It can also be used to carry a label in the end of a compound statement.
 +
 
 +
===Compound statement===
 +
A compound statement or ''block'' is a brace-enclosed sequence of statements.  
  
===Compound statements===
 
A ''compound statement'' or ''block'' is a brace-enclosed sequence of statements.
 
 
{{sdsc begin}}
 
{{sdsc begin}}
 
{{sdsc|num=1|1=
 
{{sdsc|num=1|1=
Line 65: Line 71:
 
{{sdsc end}}
 
{{sdsc end}}
  
When one statement is expected, but multiple statements need to be executed in sequence (for example, in an {{rlp|if}} statement or an iteration statement), a compound statement may be used:
+
When one statement is expected, but multiple statements need to be executed in sequence (for example, in an {{rlp|if}} statement or a loop), a compound statement may be used:
 +
 
 
{{source|1=
 
{{source|1=
 
if (x > 5)          // start of if statement
 
if (x > 5)          // start of if statement
{                  // start of compound statement
+
{                  // start of block
 
     int n = 1;      // declaration statement
 
     int n = 1;      // declaration statement
 
     std::cout << n; // expression statement
 
     std::cout << n; // expression statement
}                  // end of compound statement, end of if statement
+
}                  // end of block, end of if statement
 
}}
 
}}
  
Each compound statement introduces its own block {{rlp|scope}}: variables declared inside a block are destroyed at the closing brace in reverse order of declaration:
+
Each compound statement introduces its own block {{rlp|scope}}: variables declared inside a block are destroyed at the closing brace in reverse order.
 +
 
 
{{source|1=
 
{{source|1=
 
int main()
 
int main()
 
{
 
{
     {                                // start of compound statement
+
     {                                // start of block
 
         std::ofstream f("test.txt"); // declaration statment
 
         std::ofstream f("test.txt"); // declaration statment
 
         f << "abc\n";                // expression statement
 
         f << "abc\n";                // expression statement
     }                                // end of compound statement,
+
     }                                // end of block: f is flushed and closed
                                    // f is flushed and closed by ofstream's destructor
+
     std::ifstream f("test.txt");  
     std::ifstream f("test.txt");
+
 
     std::string str;
 
     std::string str;
     f >> str;
+
     f >> str;  
 
}
 
}
 
}}
 
}}
  
 
===Selection statements===
 
===Selection statements===
A ''selection statement'' chooses between one of several flows of control.
+
Selection statements choose between one of several flows of control
 +
 
 
{{sdsc begin}}
 
{{sdsc begin}}
 
{{sdsc|num=1|1=
 
{{sdsc|num=1|1=
Line 108: Line 116:
  
 
===Iteration statements===
 
===Iteration statements===
An ''iteration statement'' repeatedly executes some code.
+
Iteration statements repeatedly execute some code.
 +
 
 
{{sdsc begin}}
 
{{sdsc begin}}
 
{{sdsc|num=1|1=
 
{{sdsc|num=1|1=
Line 124: Line 133:
 
{{sdsc end}}
 
{{sdsc end}}
  
@1@ {{rlp|while}} statement;
+
@1@ {{rlp|while}} loop;
@2@ {{rlp|do|do-while}} statement;
+
@2@ {{rlp|do|do-while}} loop;
@3@ {{rlp|for|for}} statement;
+
@3@ {{rlp|for|for}} loop;
@4@ {{rlp|range-for|range for}} statement.
+
@4@ {{rlp|range-for|range for}} loop.
  
 
===Jump statements===
 
===Jump statements===
A ''jump statement'' unconditionally transfers flow of control.
+
Jump statements unconditionally transfer flow control
 +
 
 
{{sdsc begin}}
 
{{sdsc begin}}
 
{{sdsc|num=1|1=
 
{{sdsc|num=1|1=
Line 155: Line 165:
 
@5@ {{rlp|goto}} statement.
 
@5@ {{rlp|goto}} statement.
  
Note: for all jump statements, transfer out of an iteration statement, 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.
+
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.
  
 
===Declaration statements===
 
===Declaration statements===
A ''declaration statement'' introduces one or more identifiers into a block.
+
Declaration statements introduce one or more identifiers into a block.
 +
 
 
{{sdsc begin}}
 
{{sdsc begin}}
 
{{sdsc|num=1|1=
 
{{sdsc|num=1|1=
Line 167: Line 178:
  
 
===Try blocks===
 
===Try blocks===
A ''try block'' provides the ability to catch exceptions thrown when executing other statements.
+
Try blocks provide the ability to catch exceptions thrown when executing other statements.
 +
 
 
{{sdsc begin}}
 
{{sdsc begin}}
 
{{sdsc|num=1|1=
 
{{sdsc|num=1|1=

Revision as of 07:46, 21 January 2016

 
 
C++ language
General topics
Flow control
Conditional execution statements
if
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
 
 

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
}


There are seven types of statements:

1) expression statements;
2) compound statements;
3) selection statements;
4) iteration statements;
5) jump statements;
6) declaration statements;
7) try blocks.

Contents

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. Labels (and only labels) have function scope. Labels are ignored by unqualified lookup: a label can have the same name as any other entity in the program.

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.

Compound statement

A compound statement or block is a brace-enclosed sequence 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 statment
        f << "abc\n";                // expression statement
    }                                // end of block: f is flushed and closed
    std::ifstream f("test.txt"); 
    std::string str;
    f >> str; 
}

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)
1) if statement;
2) if statement with an else clause;
3) switch statement.

Iteration statements

Iteration statements repeatedly execute some code.

attr(optional) while ( condition ) statement (1)
attr(optional) do statement while ( expression ) ; (2)
attr(optional) for ( 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.

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.

Declaration statements

Declaration statements introduce one or more identifiers into a block.

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

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.

See also

C documentation for Statements