{ }codelper

学习 › C

流程控制 · 06

循环

把同一件事做很多次:for 和 while。

循环会把同一段代码执行很多次。
下面的例子从 1 到 n 逐个输出数字并累加,最后输出总和。

#include <stdio.h> int main(void) {    int n, total = 0;    scanf("%d", &n);    for (int i = 1; i <= n; i++) {        printf("%d\n", i);        total += i;    }    printf("%d\n", total);    return 0;}
stdin
5
stdout
1
2
3
4
5
15

要点

  • 最常见的形式是“从 1 到 n”。
    要定下起始值、继续的条件,以及每一轮的变化量。
  • 在循环中把值收集起来的累加(total += i)是求和、计数、求最大值题目的基础。
  • 逐个遍历列表或字符串时,有不用下标、直接取出值的简短写法。
  • while 只看条件,条件为真就一直循环。
  • break 跳出循环,continue 只跳过本轮。
    两者都只作用于最内层的一个循环,所以要一次跳出双重循环,可以用标记变量,或者在函数中 return。

各语言的写法

Pythonfor i in range(1, n + 1): — range 不包含结束值。
步长用 range(10, 0, -2),逐个取用 for x in nums:,按条件用 while 条件:。
没有 do-while
JavaScriptfor (let i = 1; i <= n; i++),步长用 i -= 2。
逐个取用 for (const x of nums)。
while (条件) { }、do { } while (条件);。
要跳出外层循环用标签 break outer;
TypeScript和 JavaScript 一样
Javafor (int i = 1; i <= n; i++),逐个取用 for (int x : nums)。
while、do { } while。
也可以用标签 break outer;
C#for (int i = 1; i <= n; i++),逐个取用 foreach (var x in nums)。
while、do { } while
C++for (int i = 1; i <= n; i++),逐个取用 for (int x : nums)。
while、do { } while
Cfor (int i = 1; i <= n; i++) — 没有逐个取值的写法,只能按下标循环。
while、do { } while
Craykon循环 (i = 1; i <= n; i++),逐个取用 遍历 (x 在 nums),按条件用 当 (条件) { }。
跳出用 跳出,跳过用 继续。
没有 do-while。
当 在场景(动画)中每轮停一帧,但在控制台解题中不停顿

常见错误

while 中没有改变条件

i = 1
while i <= 5:
    print(i)

→ 永远不会结束,一直输出 1

一定要在循环体里写改变条件的那一行(i += 1、i++)。

循环结束后还用 iJava · C# · C · C++ · JavaScript · TypeScript · Craykon

for (int i = 0; i < 3; i++) { }
printf("%d\n", i);

→ 报错 — 在 for 中创建的 i 只存在于循环内

循环后还要用,就在循环前创建。
Python 的 i 在循环后仍保留最后的值。

用 for … in 遍历值JavaScript · TypeScript

const nums = [10, 20];
for (const x in nums) console.log(x);

→ 0、1 — 得到的是下标而不是值(而且是字符串 "0"、"1")

遍历值要用 for (const x of nums)。

各语言的差异
Python 的 range(a, b) 不包含 b,所以 1 到 n 要写 range(1, n + 1)。
C 系和 Craykon 也要再确认一次是 i <= n 还是 i < n。
差一位导致答案错误,是循环中最常见的失误。

练习题