7 while与do-while

正在加载视频播放器…

GESP C++ 一级:while 与 do-while 循环精讲

核心目标:掌握 while 和 do-while 的语法、执行流程、与 for 的区别,会写累加、数位分离、输入判断、至少执行一次等常见循环。
while 先判断后执行,可能一次都不执行;do-while 先执行后判断,至少执行一次。


一、循环结构回顾

循环就是让一段代码重复执行。

C++ 一级需要掌握三种循环:

循环 特点 一级重要程度
for 适合次数已知的循环 重点掌握
while 适合次数未知、条件驱动的循环
do-while 至少执行一次的循环 掌握基本用法

循环三要素:

  1. 初始化:循环变量从哪开始。
  2. 条件:什么时候继续循环。
  3. 更新:每次循环后变量怎么变。
int i = 1;          // 初始化
while (i <= 5) {    // 条件
    cout << i;      // 循环体
    i++;            // 更新
}

缺少任何一步,都可能出错或死循环。


二、while 循环

1. 基本语法

while (条件) {
    循环体;
}

执行流程:

  1. 判断条件。
  2. 条件为真,执行循环体。
  3. 循环体执行完,回到第 1 步继续判断。
  4. 条件为假,跳出循环,执行后面的代码。

口诀:

先判断,后执行;
条件真,就循环;
条件假,就结束。

2. 示例:输出 1 到 5

int i = 1;
while (i <= 5) {
    cout << i << " ";
    i++;
}

输出:

1 2 3 4 5

3. 示例:求 1 到 n 的和

int n;
cin >> n;

int i = 1;
int sum = 0;

while (i <= n) {
    sum += i;
    i++;
}

cout << sum << endl;

4. 示例:数位分离

int n;
cin >> n;

while (n > 0) {
    int d = n % 10;   // 取个位
    cout << d << " ";
    n /= 10;          // 去掉个位
}

输入 1234,输出:

4 3 2 1

5. 示例:输入直到满足条件

int x;
cin >> x;

while (x != 0) {
    cout << x << " ";
    cin >> x;
}

输入:

3 5 0

输出:

3 5

6. 条件为假时一次也不执行

int i = 10;
while (i <= 5) {
    cout << i;
    i++;
}

因为 10 <= 5 为假,循环体一次也不执行。


三、do-while 循环

1. 基本语法

do {
    循环体;
} while (条件);

注意:

  • do 后面先执行循环体。
  • 再判断 while 条件。
  • 条件为真,继续循环。
  • 条件为假,结束循环。
  • 末尾必须有分号 ;。

执行流程:

  1. 先执行一次循环体。
  2. 判断条件。
  3. 条件为真,回到第 1 步。
  4. 条件为假,结束循环。

口诀:

先执行,后判断;
至少执行一次;
末尾别忘分号。

2. 示例:输出 1 到 5

int i = 1;
do {
    cout << i << " ";
    i++;
} while (i <= 5);

输出:

1 2 3 4 5

3. 示例:至少执行一次

int i = 10;
do {
    cout << "执行一次" << endl;
    i++;
} while (i <= 5);

输出:

执行一次

因为先执行,后判断,即使条件一开始为假,也会执行一次。

4. 示例:输入直到输入 0

int x;
do {
    cin >> x;
    if (x != 0) {
        cout << x << " ";
    }
} while (x != 0);

输入:

3 5 0

输出:

3 5

四、while 与 do-while 的区别

项目 while do-while
判断时机 先判断,后执行 先执行,后判断
最少执行次数 0 次 1 次
末尾分号 无 必须有 ;
适用场景 条件可能一开始就不成立 至少需要执行一次
语法 while (条件) { } do { } while (条件);

示例对比:

int i = 10;

while (i <= 5) {
    cout << "while";
    i++;
}
// 不输出
int i = 10;

do {
    cout << "do-while";
    i++;
} while (i <= 5);
// 输出一次 do-while

五、while、do-while 与 for 的对比

循环 适合场景 示例
for 次数已知 for (int i = 1; i <= n; i++)
while 次数未知,条件驱动 while (n > 0)
do-while 至少执行一次 do { ... } while (条件);

三者可以互相转换,但各有最适合的场景。

for 版求和:

int sum = 0;
for (int i = 1; i <= n; i++) {
    sum += i;
}

while 版求和:

int i = 1, sum = 0;
while (i <= n) {
    sum += i;
    i++;
}

do-while 版求和:

int i = 1, sum = 0;
do {
    sum += i;
    i++;
} while (i <= n);

六、break 与 continue

1. break

立即跳出整个循环。

int i = 1;
while (1) {          // 死循环
    if (i > 5) break;
    cout << i << " ";
    i++;
}

输出:

1 2 3 4 5

2. continue

跳过本次循环剩余语句,进入下一次循环判断。

int i = 0;
while (i < 5) {
    i++;
    if (i == 3) continue;
    cout << i << " ";
}

输出:

1 2 4 5

注意:continue 在 while 中容易造成死循环,因为可能跳过更新语句。

错误示例:

int i = 0;
while (i < 5) {
    if (i == 3) continue;   // i 不增加,死循环
    cout << i << " ";
    i++;
}

正确写法:

int i = 0;
while (i < 5) {
    i++;
    if (i == 3) continue;
    cout << i << " ";
}

七、常见循环模型

1. 累加求和

int i = 1, sum = 0;
while (i <= n) {
    sum += i;
    i++;
}

2. 累乘求阶乘

int i = 1;
long long fac = 1;
while (i <= n) {
    fac *= i;
    i++;
}

3. 数位分离

while (n > 0) {
    int d = n % 10;
    n /= 10;
}

4. 求位数

int cnt = 0;
while (n > 0) {
    cnt++;
    n /= 10;
}

注意:如果 n = 0,位数是 1,需要特判。

5. 判断质数

bool isPrime = true;
if (n < 2) isPrime = false;

int i = 2;
while (i * i <= n) {
    if (n % i == 0) {
        isPrime = false;
        break;
    }
    i++;
}

6. 输入若干个数求和

int x, sum = 0;
while (cin >> x) {
    sum += x;
}
cout << sum << endl;

按 Ctrl+Z(Windows)或 Ctrl+D(Linux)结束输入。一级了解即可。

7. 至少执行一次

int x;
do {
    cin >> x;
    // 处理 x
} while (x != 0);

八、易错点

  1. while 条件后多写分号

    while (i <= 5);   // 错误,循环体为空,可能死循环
    
  2. do-while 末尾漏写分号

    do {
        // ...
    } while (i <= 5)   // 错误,缺少 ;
    
  3. 循环变量未初始化

    int i;
    while (i <= 5) { }   // 错误,i 值不确定
    
  4. 循环变量未更新

    int i = 1;
    while (i <= 5) {
        cout << i;   // 忘记 i++,死循环
    }
    
  5. continue 跳过更新导致死循环

    while (i < 5) {
        if (i == 3) continue;
        i++;
    }
    
  6. 混淆 while 和 do-while 的执行次数

    • while:可能 0 次。
    • do-while:至少 1 次。
  7. do-while 中变量未初始化就使用

    int x;
    do {
        cout << x;   // 错误,x 未初始化
    } while (x != 0);
    
  8. 循环边界写错

    while (i < n)   // 与 i <= n 结果不同
    
  9. break 和 continue 混用

    • break:跳出整个循环。
    • continue:只跳过本次。
  10. 输入循环忘记处理结束条件
    如 while (cin >> x) 需要手动结束输入。


九、阅读程序写结果

题目 1

int i = 1;
while (i <= 3) {
    cout << i << " ";
    i++;
}

输出:

1 2 3

题目 2

int i = 5;
while (i <= 3) {
    cout << i << " ";
    i++;
}

输出:

(无输出)

题目 3

int i = 5;
do {
    cout << i << " ";
    i++;
} while (i <= 3);

输出:

5

题目 4

int n = 123;
while (n > 0) {
    cout << n % 10 << " ";
    n /= 10;
}

输出:

3 2 1

题目 5

int i = 0, sum = 0;
while (i < 5) {
    i++;
    if (i == 3) continue;
    sum += i;
}
cout << sum << endl;

输出:

12

解释:加的是 1、2、4、5,和为 12。

题目 6

int i = 1;
while (1) {
    if (i > 3) break;
    cout << i << " ";
    i++;
}

输出:

1 2 3

题目 7

int x = 0;
do {
    cout << x << " ";
    x++;
} while (x < 3);

输出:

0 1 2

题目 8

int n = 0;
int cnt = 0;
while (n > 0) {
    cnt++;
    n /= 10;
}
cout << cnt << endl;

输出:

0

解释:n = 0 时循环不执行,cnt 为 0。如果要求位数,需要特判。


十、速查表

需求 写法
while 基本结构 while (条件) { ... }
do-while 基本结构 do { ... } while (条件);
先判断后执行 while
至少执行一次 do-while
累加求和 while (i <= n) { sum += i; i++; }
数位分离 while (n > 0) { d = n % 10; n /= 10; }
死循环 while (1) { ... break; }
跳出循环 break
跳过本次 continue
输入直到结束 while (cin >> x) { ... }
至少执行一次输入 do { cin >> x; } while (x != 0);

十一、总结

while 与 do-while 是一级循环结构的重要内容。

  1. while 先判断后执行,可能一次都不执行。
  2. do-while 先执行后判断,至少执行一次。
  3. do-while 末尾必须有分号。
  4. 循环三要素:初始化、条件、更新,缺一不可。
  5. 忘记更新循环变量会导致死循环。
  6. break 跳出整个循环,continue 跳过本次。
  7. while 适合次数未知、条件驱动的循环。
  8. do-while 适合至少执行一次的场景。

复习时多练“阅读程序写结果”和“数位分离、累加求和”两类题,重点注意循环边界、变量初始化、变量更新、continue 位置和 do-while 末尾分号。考试中先判断循环执行次数,再逐轮模拟变量变化,最后检查输出格式。