C++ 中 while 与 do...while 循环的用法、技巧与避坑

 更新时间:2026年06月04日 10:35:32   作者:noipp  
在C++ 编程中,循环结构是处理重复性任务的核心工具,本文将深入剖析 while 循环的语法、变体、常见用法以及需要警惕的陷阱,感兴趣的朋友一起看看吧

一、引言

在 C++ 编程中,循环结构是处理重复性任务的核心工具。while 循环作为最基础的循环结构之一,以其简洁的逻辑和广泛的适用性,成为每个 C++ 开发者必须熟练掌握的知识点。

for 循环不同,while 循环更适用于不确定具体循环次数,但知道何时停止的场景。本文将深入剖析 while 循环的语法、变体、常见用法以及需要警惕的陷阱。

二、基础语法

while 循环的语法非常简单,它只关心一个条件:

while (/*条件表达式*/) {
    // 循环体:只要条件为真,就反复执行这里的代码
}

执行流程:

  1. 计算条件表达式的值。
  2. 如果为 true,执行循环体,然后跳回第 1 步。
  3. 如果为 false,直接跳出循环,执行后续代码。

注意: 如果条件一开始就为 false,循环体一次都不会执行。

三、第一个例子:打印数字

让我们从一个最简单的例子开始——打印 1 到 5 的数字:

#include <iostream>
using namespace std;
int main() {
    int i = 1;  // 1. 初始化循环变量
    while (i <= 5) {  // 2. 循环条件
        cout << i << " ";  // 3. 循环体
        i++;  // 4. 更新循环变量,避免死循环
    }
    // 代码会输出:1 2 3 4 5
    return 0;
}

要点解析:

  • 初始化要在循环前完成。
  • 条件检查在每次迭代开始前进行。
  • 变量更新必须在循环体内或条件中完成,否则会死循环。

四、while的常见应用场景

4.1 不知道具体循环次数的场景

while 最擅长处理“当某条件满足时就继续”的逻辑,而不是“执行 N 次”。

示例:求用户输入的数字之和,直到输入 0 为止

#include <iostream>
using namespace std;
int main() {
    int num, sum = 0;
    cin >> num;  // 先读取第一个数
    while (num != 0) {
        sum += num;  // 加和
        cin >> num;  // 继续读取下一个数
    }
    std::cout << "总和为:" << sum;
    return 0;
}

4.2 游戏或服务器主循环

游戏引擎、服务器程序通常使用 while 来维持一个持续运行的主循环。

#include <iostream>
using namespace std;
int main() {
    bool isRunning = true;
    int choice;
    while (isRunning) {
        cout << "\n--- 菜单 ---\n";
        cout << "1. 开始游戏\n";
        cout << "2. 设置\n";
        cout << "3. 退出\n";
        cout << "请选择:\n";
        cin >> choice;
        if (choice == 3) {
              isRunning = false;  // 控制循环退出
              cout << "再见!" << std::endl;
        }
    }
        return 0;
}

4.3 使用迭代器遍历容器

while 可以配合迭代器遍历 STL 容器。

#include <iostream>
#include <vector>
using namespace std;
int main() {
    std::vector<int> nums = {10, 20, 30, 40, 50};
    auto it = nums.begin();  // 获取起始迭代器
    while (it != nums.end()) {
        std::cout << *it << " ";
        it++;  // 移动迭代器
    }
    // 代码会输出:10 20 30 40 50
    return 0;
}

五、do...while循环:至少执行一次

当需要先执行一次循环体,再判断条件时,使用 do...while

do {
    // 循环体:无论如何都会先执行一次
} while (/*条件*/);

经典示例:用户输入验证

#include <iostream>
using namespace std;
int main() {
    int password;
    do {
        cout << "请输入密码(1234):";
        cin >> password;
        if (password != 1234) cout << "密码错误!\n";
    } while (password != 1234);
    cout << "登录成功!" << std::endl;
    return 0;
}

这个场景非常适合 do...while,因为必须让用户至少输入一次密码,才能判断对错。

六、常见死循环及预防

死循环是 while 最致命的陷阱,CPU 会占用 100%,程序假死。

6.1 忘记更新循环变量

int i = 0;
while (i < 5) {
    cout << i << " ";
    // 缺少 i++;  -> 死循环!
}

6.2 错误的分号(;)

while 条件后误加分号,会导致循环体为空语句。

int i = 0;
while (i < 5);  // <-- 致命分号!循环体是空的
{
    cout << i << " ";
    i++;
}
// 程序卡死,永远进不到花括号里

6.3 有意无限循环

有时我们需要故意制造无限循环,通常会在循环体内用 break 跳出。

while (true) {
    // 处理任务
    if (exitCondition) break;  // 条件满足,跳出循环
}

七、while与for的选择

特性whilefor
适用场景循环次数未知,条件驱动循环次数已知,计数驱动
结构初始化在外部,更新在内部初始化、条件、更新集中在头部
可读性当逻辑重在某个"状态"时,更直观遍历固定范围时更简洁
典型用法while (exitCondition)for (int i = 0; i < n; i++)

建议: 如果你知道要循环 N 次,用 for;如果你知道在某个条件满足前要一直循环,用 while

八、总结

  • while 循环:先判断,后执行,可能一次都不执行。
  • do...while 循环:先执行,后判断,至少执行一次。
  • 核心要素:务必将初始化、条件、更新三要素牢记于心。
  • 防坑指南:警惕分号误放、更新遗漏导致的无尽循环。

掌握了 while 的核心理念,你就能在处理文件读取、用户交互、状态维护等复杂逻辑时,写出行云流水的代码。勤加练习,将它变成你编程肌肉记忆的一部分吧!

到此这篇关于C++ 中 while 与 do...while 循环的完全指南:用法、技巧与避坑的文章就介绍到这了,更多相关C++ while 与 do...while 循环内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解C语言中的错误报告errno与其相关应用方法

    详解C语言中的错误报告errno与其相关应用方法

    这篇文章主要介绍了C语言中的错误报告errno与其相关应用方法,包括errno和strerror以及perror的介绍,需要的朋友可以参考下
    2015-08-08
  • C语言实现学生学籍管理系统程序设计

    C语言实现学生学籍管理系统程序设计

    这篇文章主要为大家详细介绍了C语言实现学生学籍管理系统程序设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • c语言++放在前面和后面的区别分析

    c语言++放在前面和后面的区别分析

    在C语言中,前缀自增(++i)和后缀自增(i++)操作符并不是同一个操作符,前缀自增操作符的优先级高于后缀自增,同时得到的结果并不完全一致,因此需要区分
    2015-11-11
  • 关于读取popen输出结果时未截断字符串导致的命令行注入详解

    关于读取popen输出结果时未截断字符串导致的命令行注入详解

    这篇文章主要给大家介绍了关于读取popen输出结果时未截断字符串导致的命令行注入的相关资料,文中通过图文及示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-03-03
  • C++实现LeetCode(59.螺旋矩阵之二)

    C++实现LeetCode(59.螺旋矩阵之二)

    这篇文章主要介绍了C++实现LeetCode(59.螺旋矩阵之二),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • VS报错C6011的问题:取消对NULL指针的引用(解决方法)

    VS报错C6011的问题:取消对NULL指针的引用(解决方法)

    这篇文章主要介绍了VS报错C6011的问题:取消对NULL指针的引用(解决方法),C6011:取消对NULL指针的引用,发现是没有进行空指针的判断,解决方案跟随小编一起看看吧
    2024-01-01
  • C++中菱形继承的解释与处理详解

    C++中菱形继承的解释与处理详解

    菱形继承是多重继承中跑不掉的,Java拿掉了多重继承,辅之以接口。C++中虽然没有明确说明接口这种东西,但是只有纯虚函数的类可以看作Java中的接口,下面这篇文章主要给大家介绍了关于C++中菱形继承的解释与处理的相关资料,需要的朋友可以参考下
    2022-02-02
  • C++运算符重载的实现示例

    C++运算符重载的实现示例

    本文主要介绍了C++运算符重载的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-12-12
  • 使用CMake构建一个简单的C++项目的实现

    使用CMake构建一个简单的C++项目的实现

    CMake是一个跨平台的自动化构建工具,可以用于构建各种类型的项目,本文主要介绍了使用CMake构建一个简单的C++项目,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • OpenCV基于稠密光流实现视频跟踪详解

    OpenCV基于稠密光流实现视频跟踪详解

    这篇文章主要为大家详细介绍了OpenCV如何基于稠密光流实现视频跟踪功能,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
    2023-02-02

最新评论