3.2.2 for循环的变体(2)
示例说明
在for循环的初始化部分创建并初始化两个变量,然后在递增部分将它们递增。可以创建任意多的变量,只要它们具有相同的类型即可。
也可以在第二个表达式中指定多个以逗号分开的条件,该表达式是for循环的测试部分,决定着循环是否应该继续,但它一般没有用,因为只有最右边的条件影响循环结束的时间。
变量i每递增一次,变量power的值就通过与自身相加而倍增。这样将产生我们所期待的2的幂值,因此程序产生下面的输出。
- 0 1
- 1 2
- 2 4
- 3 8
- 4 16
- 5 32
- 6 64
- 7 128
- 8 256
- 9 512
- 10 1024
在第2章介绍的setw()操作符用来精确地对齐输出。我们已经嵌入了iomanip头文件,还为std名称空间中的setw名称添加了using声明,因此可以不加限定名来使用setw()。
试一试:无穷for循环
如果省略为for循环指定测试条件的第二个控制表达式,则该表达式的值将被假定为true,因此循环将无限期继续,除非提供从循环中退出的其他手段。事实上如果愿意,则可以省略for后面圆括号中的所有表达式。这样做可能看起来没有用处,但实际上恰恰相反。我们会经常遇到需要多次执行某个循环的情况,但预先不知道需要的循环次数。请看下面的程序:
- // Ex3_10.cpp
- // Using an infinite for loop to compute an average
- #include <iostream>
- using std::cin;
- using std::cout;
- using std::endl;
- int main()
- {
- double value(0.0); // Value entered stored here
- double sum(0.0); // Total of values accumulated here
- int i(0); // Count of number of values
- char indicator('n'); // Continue or not
- for(;;) // Indefinite loop
- {
- cout << endl
- << "Enter a value: ";
- cin >> value; // Read a value
- ++i; // Increment count
- sum += value; // Add current input to total
- cout << endl
- << "Do you want to enter another value (enter y or n) ";
- cin >> indicator; // Read indicator
- if (('n' == indicator) || ('N' == indicator))
- break; // Exit from loop
- }
- cout << endl
- << "The average of the " << i
- << " values you entered is " << sum/i << "."
- << endl;
- return 0;
- }
示例说明
该程序计算任意数量的值的平均值。在输入每个值之后,需要输入一个字符y或n,来指示是否想输入另一个值。执行该示例的典型输出如下:
- Enter a value: 10
- Do you want to enter another value (enter n to end) y
- Enter a value: 20
- Do you want to enter another value (enter n to end) y
- Enter a value: 30
- Do you want to enter another value (enter n to end) n
- The average of the 3 values you entered is 20.
在声明并初始化要使用的变量之后,进入一个未指定任何表达式的for循环,因此没有关于循环结束条件的规定。紧跟其后的语句块是重复执行的循环主体。
循环块完成3个基本动作:
读取某个值
将从cin读取的值与sum相加
检查用户是否想继续输入值
循环块中的第一个动作是提示用户输入一个值,然后将其读入变量value。输入的值与sum相加,同时计数器i递增。在累加sum中的值之后,程序询问用户是否想输入另一个值,并提示用户输入y,如果已经结束就输入n。输入的字符存储在变量indicator中,该变量在if语句中用于测试输入的字符是否是n或N。如果既不是n也不是N,则循环继续;否则执行break。循环中break的作用类似于它在switch语句中的作用。在这种情况下,break将控制权传递给循环块的右大括号后面的语句,使循环立即结束。
最后,输出输入值的个数以及将sum除以i后得到的平均值。当然,计算之前i被升级为double类型,参见第2章关于类型强制转换的讨论。
1. 使用continue语句
continue语句可以简明地写成下面的形式:
- continue;