while 循环是没有初始化和更新部分的 for 循环,它只有测试条件和循环体:
while (test_expr)
body
while 循环也是一种入口条件循环,如果测试条件为 true,则执行循环体中的语句,然后返回测试条件,重新评估,直到测试条件为 false,循环终止。while循环的运行如下图所示:
下面通过一个示例程序了解一下 while 循环的运行:
//while.cpp -- introducing the while loop #include <iostream> const int ArSize = 20; int main() { using namespace std; char name[ArSize]; cout << "Your first name, please: "; cin >> name; cout << "Here is your name, verticalized and ASCIIized:\n"; int i = 0; while (name[i] != '\0') { cout << name[i] << ": " << int(name[i]) << endl; i++; } return 0; }
上面的程序通过 while 循环遍历字符串,并显示其中的字符及其 ASCII 码,循环在遇到空值字符时停止(C-风格字符串--字符数组,以空值字符 '\0' 结尾,空值字符的编码为 0 或 false),所以上面示例程序中 while 循环也可以修改为 while ( name[ i ] )。
for 与 while
在C++中,for 和 while 循环本质上是相同的。例如,下面的 for 循环:
for ( init_expr; test_expr; update_expr )
{
statement(s)
}
可以改写成 while 循环:
init_expr;
while ( test_expr )
{
statement(s)
update_expr;
}
同样,下面的 while 循环:
while ( test_expr )
body
可以改写成 for 循环:
for ( ; test_expr; )
body
for 循环需要3个表达式,不过它们可以是空表达式,只有两个分号是必需的。另外,如果省略 for 循环中的测试表达式,测试结果将为 true,for 循环将一直运行下去。
通常,当可以预知循环次数时,使用 for 循环;在无法预知循环次数时,使用 while 循环。设计循环时的指导原则:
- 指定循环终止的条件。
- 在首次测试之前初始化条件。
- 在条件被再次测试之前更新条件。
类型别名
通过一个延时循环的示例程序,了解一下类型别名的概念。
//waiting.cpp -- using clock() in a time-delay loop #include <iostream> #include<ctime> int main() { using namespace std; cout << "Enter the delay time, in seconds: "; float secs; cin >> secs; clock_t delay = secs * CLOCKS_PER_SEC; cout << "starting\a\n"; clock_t start = clock(); while ( clock() - start < delay ) { ; } cout << "done\a\n"; return 0; }
上面的示例程序中,库函数 clock() 返回程序开始执行后所用的系统时间。这里存在两个问题:首先,clock() 返回时间的单位不一定是秒;其次,该函数的返回类型在某些系统上可能是 long,在另一些系统上可能是 unsigned long 或其他类型。
头文件 ctime 提供了这些问题的解决方案。首先。它定义了一个符号常量——CLOCKS_PER_SEC,该常量等于每秒包含的系统时间单位数,因此用系统时间除以这个值,可以得到秒数;或者将秒数乘以这个值可以得到以系统时间单位为单位的时间。其次,ctime 将 clock_t 作为 clock() 返回类型的别名,这意味着可以将变量声明为 clock_t 类型,编译器将把它转换为 long、unsigned int 或适合系统的其他类型。
示例程序中的 while 循环的循环体只有一个分号,表示无任何动作的循环。C++为类型建立别名的方式有两种。第一种是使用预处理器:
#define BYTE char
这样,预处理器将在编译程序时用 char 替换所有的 BYTE,从而使 BYTE 成为 char 的别名。
第二种方法是使用C/C++的关键字 typedef 来创建别名。例如,要将 byte 作为 char 的别名,可以这样做:
typedef char byte;
下面是通用格式:
typedef typeName aliasName;