循环
循环
循环用于重复执行一段代码。让你的程序能够反复执行一段代码是编程中最基本但非常有用的任务之一——许多生成极其复杂输出的程序或网站(例如留言板)实际上只是在执行一个单一的任务多次。(它们可能执行的是少量任务,但原则上,要生成消息列表只需要重复读取某些数据并显示它们。)现在,思考一下这意味着什么:循环让你通过简单的重复就能编写出产生显著更佳结果的语句。
一个注意事项:在继续之前,你应该理解 C 语言中真和假的概念,因为在处理循环时(条件与 if 语句相同)这将很有必要。这个概念在之前已经说过。有三种类型的循环:for、while 和 do..while。它们各自有其特定的用途。下面将详细说明。
FOR
for 循环是最有用的类型。for 循环的语法是
for ( 变量初始化; 条件; 变量更新 ) {
当条件为真时执行的代码
}变量初始化允许你声明一个变量并给它赋值,或者给一个已存在的变量赋值。其次,条件告诉程序在条件表达式为真时,循环应该继续重复执行。变量更新部分是 for 循环处理变量变化的最简单方式。可以进行诸如 x++、x = x + 10,甚至 x = random(5)等操作,如果你真的想这么做,你还可以调用其他对变量无影响但仍然对代码有作用的函数。注意分号分隔这些部分,这一点很重要。还要注意,每一个部分都可能为空,尽管分号仍然必须存在。如果条件为空,它被评估为真,循环将重复执行直到其他因素停止它。
实例:
#include <stdio.h>
int main()
{
int x;
/* 当x小于10时循环进行,x每循环增加1*/
for ( x = 0; x < 10; x++ ) {
/* 请记住,循环条件在再次循环之前检查条件语句。
因此,当x等于10时,循环中断。
在检查条件之前更新X。 */
printf( "%d\n", x );
}
getchar();
}这个程序是一个非常简单的 for 循环示例。x 被设置为 0,当 x 小于 10 时,它调用 printf 来显示变量 x 的值,并给 x 加 1 直到条件满足。还要记住,变量在循环代码第一次运行后被递增。
WHILE
WHILE 循环非常简单。基本结构是
while (条件) {
在条件为真时执行的代码
}"真"表示一个布尔表达式,可以是 x == 1 或 while (x != 7)(x 不等于 7)。可以是任何合法的布尔语句组合。甚至,(while x ==5 || v == 7)表示当 x 等于五或 v 等于 7 时执行代码。注意,WHILE 循环就像 FOR 循环的一个精简版本——它没有初始化或更新部分。然而,对于 WHILE 循环来说,空的条件是不合法的,就像 FOR 循环一样。
实例:
#include <stdio.h>
int main()
{
int x = 0; /* 不要忘记声明变量 */
while ( x < 10 ) { /* 当x小于10时 */
printf( "%d\n", x );
x++; /* 更新x,使条件最终能够满足 */
}
getchar();
}这是一个简单的例子,但它比上面的 FOR 循环长。最容易理解这个循环的方式是,当它到达循环末尾的大括号时,它会跳回到循环的开始部分,再次检查条件,并决定是否重复执行代码块,或者停止并转到代码块后面的下一行语句。
DO..WHILE
DO..WHILE 循环适用于至少需要执行一次的情况。其结构是
do {
} while ( condition );注意条件是在代码块结束时而不是开始时进行测试的,因此代码块至少会执行一次。如果条件为真,我们会跳回代码块的开始处再次执行它。DO..WHILE 循环几乎和 WHILE 循环一样,只是循环体保证至少执行一次。WHILE 循环表示“当条件为真时循环,并执行这段代码”,而 DO..WHILE 循环表示“执行这段代码,然后继续在条件为真的情况下循环”。
示例:
#include <stdio.h>
int main()
{
int x;
x = 0;
do {
/* 即使条件为假,“Hello, world!”也至少打印一次 */
printf( "Hello, world!\n" );
} while ( x != 0 );
getchar();
}请注意,在上面的示例中,WHILE 后面必须包含一个尾随分号。一个常见的错误是忘记 DO..WHILE 循环必须以分号结束(其他循环不应该以分号结束,这增加了混淆)。注意这个循环会执行一次,因为它在检查条件之前会自动执行。
Break 和 Continue
两个对循环非常重要的关键字是 break 和 continue。
break 命令会无条件地退出最内层的循环。如果想在特殊情况下退出循环,break 就很有用。例如,假设我们正在开发一个双人跳棋游戏。程序的基本结构可能如下所示:
while (true)
{
take_turn(player1);
take_turn(player2);
}这将使游戏在玩家 1 和玩家 2 之间交替进行。这个逻辑的唯一问题是无法退出游戏;循环会无限运行!让我们尝试以下代码:
while(true)
{
if (someone_has_won() || someone_wants_to_quit() == TRUE)
{break;}
take_turn(player1);
if (someone_has_won() || someone_wants_to_quit() == TRUE)
{break;}
take_turn(player2);
}这段代码实现了我们想要的效果——在正常情况下,游戏的主循环会继续运行,但在特殊条件(获胜或退出)下,流程会停止,我们的程序会做其他事情。
continue 是另一个控制循环流程的关键字。
如果你正在执行一个循环并遇到 continue 语句,循环会停止当前迭代,更新自身(在 for 循环的情况下),然后从顶部重新开始执行。本质上,continue 语句的意思是“这一轮循环已经完成,让我们继续执行循环,而忽略我之后的所有代码。”假设我们正在实现一个摩根游戏。像上面一样,我们想用循环来控制轮到谁,但在摩根游戏中控制轮次比在跳棋中要复杂一些。那么我们的代码的基本结构可能看起来像这样:
for (player = 1; someone_has_won == FALSE; player++)
{
if (player > total_number_of_players)
{player = 1;}
if (is_bankrupt(player))
{continue;}
take_turn(player);
}这样,如果某个玩家不能轮到她,游戏不会为所有人停止;我们只是跳过她,继续执行下一个玩家的轮次。
