for
loopGeneral topics | ||||||||||||||||
Flow control | ||||||||||||||||
Conditional execution statements | ||||||||||||||||
Iteration statements (loops) | ||||||||||||||||
| ||||||||||||||||
Jump statements | ||||||||||||||||
Functions | ||||||||||||||||
Function declaration | ||||||||||||||||
Lambda function expression | ||||||||||||||||
inline specifier | ||||||||||||||||
Dynamic exception specifications(until C++17*) | ||||||||||||||||
noexcept specifier(C++11) | ||||||||||||||||
Exceptions | ||||||||||||||||
Namespaces | ||||||||||||||||
Types | ||||||||||||||||
Specifiers | ||||||||||||||||
| ||||||||||||||||
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 | ||||||||||||||||
| ||||||||||||||||
Special member functions | ||||||||||||||||
Templates | ||||||||||||||||
Miscellaneous | ||||||||||||||||
Conditionally executes a statement repeatedly, where the statement does not need to manage the loop condition.
Contents |
attr (optional)for ( init-statementcondition (optional); expression (optional)) statement | |||||||||
attr | - | (since C++11) any number ofattributes | ||
init-statement | - | one of
Note that anyinit-statement must end with a semicolon. This is why it is often described informally as an expression or a declaration followed by a semicolon. | ||
condition | - | acondition | ||
expression | - | anexpression (typically an expression that increments the loop counter) | ||
statement | - | astatement (typically a compound statement) |
Acondition can either be anexpression or asimple declaration.
| (since C++26) |
When control reaches condition, the condition will yield a value, which is used to determine whetherstatement will be executed.
Ifcondition is an expression, the value it yields is the the value of the expression contextually converted tobool. If that conversion is ill-formed, the program is ill-formed.
Ifcondition is a simple declaration, the value it yields is the value of the decision variable (see below) contextually converted tobool. If that conversion is ill-formed, the program is ill-formed.
The declaration has the following restrictions:
| (until C++11) |
| (since C++11) |
The decision variable of the declaration is the declared variable.
Structured binding declarationThe declaration has the following restrictions:
The decision variable of the declaration is the invented variableeintroduced by the declaration. | (since C++26) |
Afor statement equivalent to:
{
| |||||||||
Except that
If the loop needs to be terminated withinstatement, abreak statement can be used as terminating statement.
If the current iteration needs to be terminated withinstatement, acontinue statement can be used as shortcut.
As is the case withwhile
loop, ifstatement is not a compound statement, the scope of variables declared in it is limited to the loop body as if it was a compound statement.
for(;;)int n;// n goes out of scope
As part of the C++forward progress guarantee, the behavior isundefined if a loop that is not atrivial infinite loop(since C++26) withoutobservable behavior does not terminate. Compilers are permitted to remove such loops.
While in C names declared in the scope ofinit-statement andcondition can be shadowed in the scope ofstatement, it is forbidden in C++:
for(int i=0;;){long i=1;// valid C, invalid C++// ...}
#include <iostream>#include <vector> int main(){std::cout<<"1) typical loop with a single statement as the body:\n";for(int i=0; i<10;++i)std::cout<< i<<' '; std::cout<<"\n\n""2) init-statement can declare multiple names, as\n""long as they can use the same decl-specifier-seq:\n";for(int i=0,*p=&i; i<9; i+=2)std::cout<< i<<':'<<*p<<' '; std::cout<<"\n\n""3) condition may be a declaration:\n";char cstr[]="Hello";for(int n=0;char c= cstr[n];++n)std::cout<< c; std::cout<<"\n\n""4) init-statement can use the auto type specifier:\n";std::vector<int> v={3,1,4,1,5,9};for(auto iter= v.begin(); iter!= v.end();++iter)std::cout<<*iter<<' '; std::cout<<"\n\n""5) init-statement can be an expression:\n";int n=0;for(std::cout<<"Loop start\n";std::cout<<"Loop test\n";std::cout<<"Iteration "<<++n<<'\n'){if(n>1)break;} std::cout<<"\n""6) constructors and destructors of objects created\n""in the loop's body are called per each iteration:\n";struct S{ S(int x,int y){std::cout<<"S::S("<< x<<", "<< y<<"); ";} ~S(){std::cout<<"S::~S()\n";}};for(int i{0}, j{5}; i< j;++i,--j) S s{i, j}; std::cout<<"\n""7) init-statement can use structured bindings:\n";long arr[]{1,3,7};for(auto[i, j, k]= arr; i+ j< k;++i)std::cout<< i+ j<<' ';std::cout<<'\n';}
Output:
1) typical loop with a single statement as the body:0 1 2 3 4 5 6 7 8 9 2) init-statement can declare multiple names, aslong as they can use the same decl-specifier-seq:0:0 2:2 4:4 6:6 8:8 3) condition may be a declaration:Hello 4) init-statement can use the auto type specifier:3 1 4 1 5 9 5) init-statement can be an expression:Loop startLoop testIteration 1Loop testIteration 2Loop test 6) constructors and destructors of objects createdin the loop's body are called per each iteration:S::S(0, 5); S::~S()S::S(1, 4); S::~S()S::S(2, 3); S::~S() 7) init-statement can use structured bindings:4 5 6
range-for loop(C++11) | executes loop over range[edit] |
C documentation forfor |