C++ while语句
我们可以使用while语句重写countdown函数:
void countdown (int n) {
while (n > 0) {
cout << n << endl;
n = n-1;
}
cout << "Blastoff!" << endl;
}
你几乎可以像阅读英语一样阅读while语句。这段代码的含义是:当n大于0时,继续显示n的值,然后将n减少1;当n变为0时,输出单词“Blastoff!”。
while语句执行流程的更正式的描述如下:
- 对括号内的条件表达式求值,得到true或false;
- 如果条件为false,退出while语句,继续执行下一条语句;
- 如果条件为true,执行花括号里的没一条语句,然后回到第1步。
这类流程成为循环,因为第3步会回到起点。注意,如果初次进入循环判断条件为false,循环内的语句将不会执行。循环内的语句成为循环体。
循环体应改变一个或多个变量的值,使循环条件最终能变为false,以结束循环。反之,循环将永远反复执行,这种情形称为无限循环。本着娱乐无限的精神,计算机科学家发现下面这个洗发指导步骤是一个无限循环:抹洗发水,清洗,然后重复。
在countdown这个例子中,我们可以证明循环会结束,因为已知n的值是有限的,而且我们看到n在每次循环(迭代)后都会减小,所以最终n的值会变为0。另外一个例子就不好说了:
void sequence (int n) {
while (n != 1) {
cout << n << endl;
if (n%2 == 0) { // n为偶数
n = n / 2;
} else { // n为奇数
n = n*3 + 1;
}
}
}
循环条件是n!=1,因而循环将持续下去,直到n变为1,是条件为false。
每一次迭代,程序输出n的值,然后检查n是奇数还是偶数;如果是偶数,则n的值要除以2;如果是奇数,则n的值用3n+1取代。举个例子,如果循环初值(作为参数传给sequence)为3,结果序列就是3、10、5、16、8、4、2、1。
由于n或增或减,并没有明显证据能证明n一定会变到1,或者说程序会结束。对于n的某些特定值,我们可以证明程序会结束。例如,如果初值是2的幂,则n的值每次循环结果都是偶数,最终会变到1。前面的例子,初值是16,程序就在输出一个序列后结束。
不考虑特定值,我们是否能证明程序对于n的所有值都能结束?这个问题很有趣。到目前为止,没有人能够证明之,但也没有人能推翻之!