2.4.8 陷阱:无限循环
只要while之后的布尔表达式为true,while或do-while循环就不会终止。布尔表达式通常包含一个将由循环主体更改的变量。变量应不断更改,最终使布尔表达式求值为false,从而终止循环。然而,假如不小心让布尔表达式始终为true,循环就会一直运行。这种循环称为无限循环。
首先描述一个能终止的循环。以下C++(www.cppentry.com)代码输出小于12的所有正偶数。也就是说,它将逐行输出数字2,4,6,8和10,然后循环终止:
- x = 2;
- while (x != 12)
- {
- cout << x << endl;
- xx = x + 2;
- }
-
每次循环迭代,x的值都递增2,直到变成12。此时,单词while之后的布尔表达式不再为true,所以循环结束。
现在假设要输出小于12的奇数,而不是偶数。你可能错误地认为只需这样修改初始化语句:
- x = 1;
但这是错误的,它会导致无限循环。因为x的值会从11变成13,永远不等于12,所以循环永远不会终止。
用==或!=检查一个数来终止循环,很容易出现无限循环问题。处理数字时,更安全的做法始终是测试它是否已超过了一个值。例如,将前面while循环的第一行改为以下语句,就可将x初始化为任意数字,循环始终都能正常终止:
- while (x < 12)
无限循环的程序不能自动停止,除非强行终止。初学编程(www.cppentry.com)的读者可能写出含有无限循环的程序,所以最好学会怎样强行终止程序。强行终止程序的方法因系统而异。在很多系统上,按住键盘上的Control+C(按Ctrl键的同时按C键)就可以终止程序。
自测题
28.以下代码的输出是什么(假定它们已嵌入一个正确的程序,而且x已声明为int类型)?
- x = 10;
- while (x > 0)
- {
- cout << x << endl;
- xx = x - 3;
- }
29.在上一题中,如果将>替换为<,会输出什么?
30.以下代码的输出是什么(假定它们已嵌入一个正确的程序,而且x已声明为int类型)?
- x = 10;
- do
- {
- cout << x << endl;
- xx = x - 3;
- } while (x > 0);
31.以下代码的输出是什么(假定它们已嵌入一个正确的程序,而且x已声明为int类型)? - x = -42;
- do
- {
- cout << x << endl;
- xx = x - 3;
- } while (x > 0);
32.while语句和do-while语句有何重要区别?
33.以下代码的输出是什么(假定它们已嵌入一个正确的程序,而且x已声明为int类型)?
- x =10;
- while (x > 0)
- {
- cout << x << endl;
- xx = x + 3;
- }
34.写一个完整的C++(www.cppentry.com)程序,使其逐行输出1~20的整数。该程序不执行别的任务。