3.2.2 for循环的变体(1)
大多数时候,for循环中的表达式都是以相当标准的方式使用的:第一个表达式用于初始化一个或多个循环计数器,第二个表达式用于测试循环是否应该继续,第三个表达式递增或递减一个或多个循环计数器。没人强迫我们以这种方式使用表达式,但是,可能有相当多的变体。
for循环中的初始化表达式也可以包括循环变量的声明。在前面的示例中,还可以这样编写循环,即在第一个控制表达式中包括循环计数器i的声明。
- for(int i = 1; i <= max; i++) // Loop specification
- sum += i; // Loop statement
当然,可能需要省略该程序中原来对i的声明。如果对上一个示例进行这样的修改,则将发现该程序现在不能编译。因为循环变量i在循环之后不再存在,所以不能在输出语句中引用该变量。循环的作用域从for表达式开始,一直延伸到循环体的结束。循环体可以是大括号之间的代码块,也可以是一条语句。现在计数器i是在循环作用域内声明的,所以不能在输出语句中引用该变量,因为输出语句在循环作用域的外部。如果需要在执行循环之后使用计数器的值,则必须在循环作用域的外部声明计数器变量。
可以完全省略循环中的初始化表达式。因为i具有初始值1,所以可以将该循环写成下面的形式:
- for(; i <= max; i++) // Loop specification
- sum += i; // Loop statement
该循环仍然需要分开初始化表达式与测试表达式的分号。事实上,无论是否省略任何或全部控制表达式,两个分号都不能省略。如果省略第一个分号,编译器将无法判断省略了哪个表达式,或者说遗漏了哪个分号。
循环语句可以为空。例如,可以将上一个示例中for循环的循环语句放入递增表达式内部,这种情况下该循环就成为:
- for(; i <= max; sum += i++); // The whole loop
为了指示循环语句为空,仍然需要在圆括号后面加上分号。如果省略该分号,则紧跟这行代码的语句将被解释为循环语句。有时,空循环语句会写在单独一行上,如下所示。
- for(; i <= max; sum += i++) // The whole loop
- ;
试一试:使用多个计数器
为了在for循环中包括多个计数器,可以使用逗号运算符。在下面的程序中,将看到这种用法。
- // Ex3_09.cpp
- // Using multiple counters to show powers of 2
- #include <iostream>
- #include <iomanip>
- using std::cin;
- using std::cout;
- using std::endl;
- using std::setw;
- int main()
- {
- const int max(10);
- for(long i = 0L, power = 1L; i <= max; i++, power += power)
- cout << endl
- << setw(10) << i << setw(10) << power; // Loop statement
- cout << endl;
- return 0;
- }