跳转至

『C语言教程』3. 循环结构

T09:04:00+08:00 「计算机最擅长的事情,就是重复」

一、while 和 do while

假如想要计算机在满足某一条件时反复执行一段逻辑,那么就需要用到循环。

我们在平常生活中的表述大概是:「只要 没课,就一直 睡觉」,对应 C 语言的语句就是 while 语句。

C
while (<条件>) <语句>

while (<条件>)
    <语句>

while (<条件>) {
    <语句块内的语句>
    <语句块内的语句>
    <语句块内的语句>
}

有点像是循环版本的 if 语句,他的运行方式就像 if 一样,不过每次 while 语句整体执行完的时候会重新再执行,直至条件为假时才执行后续语句。

比如我们想要输出 1~3:

C
1
2
3
4
5
6
int i = 1;
while (i <= 3) {
    printf("%d\n", i);
    i++;
}
printf("下面的语句\n");

执行 第1行:声明变量 i 并初始化为 1.

执行 第2行(此时 i 为 1):判断条件 i <= 3,值为真,执行循环内的语句。

执行 第2~5行大括号所表示的语句块(循环内的语句):输出 i,并且让 i 自增。

循环内语句执行完成,再次判断条件。

执行 第2行(此时 i 为 2):判断条件 i <= 3,值为真,执行循环内的语句。

执行 第2~5行大括号所表示的语句块(循环内的语句):输出 i,并且让 i 自增。

循环内语句执行完成,再次判断条件。

执行 第2行(此时 i 为 3):判断条件 i <= 3,值为真,执行循环内的语句。

执行 第2~5行大括号所表示的语句块(循环内的语句):输出 i,并且让 i 自增。

循环内语句执行完成,再次判断条件。

执行 第2行(此时 i 为 4):判断条件 i <= 3,值为 不再 执行循环内语句,继续执行循环外后续语句。

执行 第6行(继续执行后续语句)。

还有另一种 do while 语句,其区别就是,while 是每次循环之前判断,而 do while 是每次循环之后判断,也就是说 do while 至少执行一次。

C
do <语句>
while(<条件>);

do
    <语句>
while(<条件>);

do {
    <语句块内的语句>
    <语句块内的语句>
    <语句块内的语句>
} while(<条件>);

注意 do while 的 while 后面要有 ;

二、for 循环

C
for (/*第一句话(初始化语句)*/; /*第二句话(循环条件)*/; /*第三句话(变化语句)*/)
    // 要循环的语句
  • 第一句话

在进入循环的时候执行。

  • 第二句话

在每次循环开始前执行,若值为 则循环,若值为 则退出循环。

  • 第三句话

每次循环结束后执行。

注意:这三句话可以是空语句(可以空着),但是中间的 ; 要留着。

那么可以发现 while(<条件>) 其实相当于 for(;<条件>;)

注意:在 标准C(C89)版本中(C99 以前)不允许在初始化语句内声明变量,所以下面的例子中变量声明部分都写在了 for 外面。 而自 C99 起,初始化语句内支持声明变量,因此可以直接写在里面:for (int i = 1; i <= 100; i++)

例1、输出 1~100 的数:

C
1
2
3
int i;
for (i = 1; i <= 100; i++)
    printf("%d ", i);

例2、计算1~100的和:

C
1
2
3
4
5
6
7
int ans = 0;

int i;
for (i = 1; i <= 100; i++)
    ans += i;

printf("%d ", ans);

例3、计算1~100中所有偶数的和:

C
1
2
3
4
5
6
7
int ans = 0;

int i;
for (i = 1; i <= 100; i++)
    if (i % 2 == 0) ans += i;

printf("%d ", ans);

与 if 语句一样,如果需要循环不止一个语句,需要使用 语句块(也就是用大括号括起来):

C
1
2
3
4
for (...) {
    // 语句 1
    // 语句 2
}

for 中的三句话不一定都要写上,如果不需要可以空着:

C
1
2
3
4
5
6
7
int i = 0;
for (; i < 10;) {
    printf("%d ", i);

    if (i % 2 == 0) i += 3
    else            i += 1;
}

输出:

Text Only
0 3 4 7 8

评论