for (init-statement condition; expression)
statement
init-statement 必须是声明语句、表达式语句或空语句。这些语句都以分号结束。
一般来说,init-statement 用于对每次循环过程中都要修改的变量进行初始化,或者赋给一个起始值。而 condition 则是用来控制循环的。当 condition 为 true 时,循环执行 statement。如果第一次求解 condition 就得 false 值,则不执行 statement。expression 通常用于修改在 init-statement 中初始化并在 condition 中检查的变量。它在每次循环迭代后都要求解。如果第一次求解 condition 就得 false 值,则始终不执行 expression。通常,statement 既可以是单个语句也可以是复合语句。
假设有下面的 for 循环,用于输出一个 vector 对象的内容:
for (vector<string>::size_type ind = 0;
ind != svec.size(); ++ind) {
cout << svec[ind]; // print current element
// if not the last element, print a space to separate from the next one
if (ind + 1 != svec.size())
cout << " ";
}
它的计算顺序如下:
循环开始时,执行一次 init-statement。在这个例子中,定义了 ind,并将它初始化为 0。
接着,求解 condition。如果 ind 不等于 svec.size(),则执行 for 循环体。否则,循环结束。如果在第一次循环时,条件就为 flase,则不执行 for 循环体。
如果条件为 true,则执行 for 循环体。本例中,for 循环体输出当前元素值,并检验这个元素是否是最后一个。如果不是,则输出一个空格,用于分隔当前元素和下一个元素。
最后,求解 expression。本例中,ind 自增 1。
这四步描述了 for 循环的第一次完整迭代。接着重复第 2 步,然后是和 3、4 步,直到 condition 的值为 false,即 ind 等于 svec.size() 为止。
应该谨记:在 for 语句头定义的任何对象只限制在 for 循环体里可见。因此,对本例而言,在执行完 for 语句后,ind 不再有效(即不可访问)。
for 语句头中,可以省略 init-statement、condition 或者 expression(表达式)中的任何一个(或全部)。
如果不需要初始化或者初始化已经在别处实现了,则可以省略 init-statement。例如,使用迭代器代替下标重写输出 vector 对象内容的程序,为了提高易读性,可将初始化移到循环外面:
vector<string>::iterator iter = svec.begin();
for( /* null */ ; iter != svec.end(); ++iter) {
cout << *iter; // print current element
// if not the last element, print a space to separate from the next one
if (iter+1 != svec.end())
cout << " ";
}
注意此时必须要有一个分号表明活力了 init-statement——更准确地说,分号代表一个空的 init-statement。
省略 condition,则等效于循环条件永远为 true:
for (int i = 0; /* no condition */ ; ++i)
相当于程序写为:
for (int i = 0; true ; ++i)
这么一来,循环体内就必须包含一个 break 或者 return 语句。否则,循环会一直执行直到耗尽系统的资源为止。同样地,如果省略 expression,则必须利用 break 或 return 语句跳出循环,或者在循环体内安排语句修改 condition 所检查的变量值。
for (int i = 0; i != 10; /* no expression */ ) {
// body must change i or the loop won't terminate
}
如果循环体不修改 i 的值,则 i 始终为 0,循环条件永远成立。
可以在 for 语句的 init-statement 中定义多个对象;但是不管怎么样,该处只能出现一个语句,因此所有的对象必须具有相同的一般类型:
const int size = 42;
int val = 0, ia[size];
// declare 3 variables local to the for loop:
// ival is an int, pi a pointer to int, and ri a reference to int
for (int ival = 0, *pi = ia, &ri = val;
ival != size;
++ival, ++pi, ++ri)
// ...