C++循环语句 #

一、while循环 #

1.1 基本语法 #

cpp
while (condition) {
    // 循环体
}

1.2 基本使用 #

cpp
// 打印1到10
int i = 1;
while (i <= 10) {
    std::cout << i << " ";
    i++;
}
// 输出:1 2 3 4 5 6 7 8 9 10

1.3 循环流程 #

text
开始
  ↓
判断条件 → false → 结束
  ↓ true
执行循环体
  ↓
返回判断条件

1.4 计数循环 #

cpp
// 倒计时
int count = 5;
while (count > 0) {
    std::cout << count << std::endl;
    count--;
}
std::cout << "发射!" << std::endl;

1.5 条件循环 #

cpp
// 读取输入直到特定值
int sum = 0;
int value;

std::cout << "输入数字(0结束): ";
std::cin >> value;

while (value != 0) {
    sum += value;
    std::cin >> value;
}

std::cout << "总和: " << sum << std::endl;

1.6 无限循环 #

cpp
// 无限循环
while (true) {
    // 需要在内部使用break退出
    if (shouldExit) {
        break;
    }
}

二、do-while循环 #

2.1 基本语法 #

cpp
do {
    // 循环体
} while (condition);

2.2 基本使用 #

cpp
// 打印1到10
int i = 1;
do {
    std::cout << i << " ";
    i++;
} while (i <= 10);

2.3 与while的区别 #

do-while至少执行一次循环体。

cpp
// while:可能不执行
int x = 10;
while (x < 5) {
    std::cout << "不会执行" << std::endl;
}

// do-while:至少执行一次
int y = 10;
do {
    std::cout << "执行一次" << std::endl;
} while (y < 5);

2.4 输入验证 #

cpp
int number;

do {
    std::cout << "请输入正数: ";
    std::cin >> number;
} while (number <= 0);

std::cout << "你输入的正数是: " << number << std::endl;

2.5 菜单选择 #

cpp
int choice;

do {
    std::cout << "\n===== 菜单 =====" << std::endl;
    std::cout << "1. 新建" << std::endl;
    std::cout << "2. 打开" << std::endl;
    std::cout << "3. 退出" << std::endl;
    std::cout << "请选择: ";
    std::cin >> choice;
    
    switch (choice) {
        case 1: /* 新建 */ break;
        case 2: /* 打开 */ break;
        case 3: std::cout << "退出" << std::endl; break;
        default: std::cout << "无效选择" << std::endl;
    }
} while (choice != 3);

三、for循环 #

3.1 基本语法 #

cpp
for (初始化; 条件; 更新) {
    // 循环体
}

3.2 基本使用 #

cpp
// 打印1到10
for (int i = 1; i <= 10; i++) {
    std::cout << i << " ";
}

3.3 执行流程 #

text
初始化
  ↓
判断条件 → false → 结束
  ↓ true
执行循环体
  ↓
更新
  ↓
返回判断条件

3.4 多变量 #

cpp
// 多个循环变量
for (int i = 0, j = 10; i < j; i++, j--) {
    std::cout << i << " " << j << std::endl;
}

3.5 省略部分 #

cpp
// 省略初始化
int i = 0;
for (; i < 10; i++) {
    std::cout << i << " ";
}

// 省略条件(无限循环)
for (int i = 0; ; i++) {
    if (i >= 10) break;
    std::cout << i << " ";
}

// 省略更新
for (int i = 0; i < 10; ) {
    std::cout << i << " ";
    i++;
}

// 全部省略(无限循环)
for (;;) {
    // 需要break退出
}

3.6 常见应用 #

cpp
// 遍历数组
int arr[] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; i++) {
    std::cout << arr[i] << " ";
}

// 计算阶乘
int n = 5;
int factorial = 1;
for (int i = 1; i <= n; i++) {
    factorial *= i;
}
// factorial = 120

// 打印乘法表
for (int i = 1; i <= 9; i++) {
    for (int j = 1; j <= i; j++) {
        std::cout << j << "*" << i << "=" << i*j << " ";
    }
    std::cout << std::endl;
}

四、范围for循环(C++11) #

4.1 基本语法 #

cpp
for (declaration : range) {
    // 循环体
}

4.2 基本使用 #

cpp
// 遍历数组
int arr[] = {1, 2, 3, 4, 5};
for (int x : arr) {
    std::cout << x << " ";
}

// 遍历vector
std::vector<int> vec = {1, 2, 3, 4, 5};
for (int x : vec) {
    std::cout << x << " ";
}

// 遍历string
std::string str = "Hello";
for (char c : str) {
    std::cout << c << " ";
}

4.3 引用修改 #

cpp
std::vector<int> vec = {1, 2, 3, 4, 5};

// 使用引用修改元素
for (int& x : vec) {
    x *= 2;  // 每个元素乘以2
}

// 使用const引用(只读)
for (const int& x : vec) {
    std::cout << x << " ";  // 只读访问
}

4.4 使用auto #

cpp
std::vector<int> vec = {1, 2, 3, 4, 5};

// 使用auto
for (auto x : vec) {
    std::cout << x << " ";
}

// 使用auto引用
for (auto& x : vec) {
    x *= 2;
}

// 使用const auto引用
for (const auto& x : vec) {
    std::cout << x << " ";
}

4.5 初始化语句(C++20) #

cpp
// C++20:在范围for中初始化
for (auto vec = getVector(); const auto& x : vec) {
    std::cout << x << " ";
}

五、嵌套循环 #

5.1 基本使用 #

cpp
// 打印矩形
for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 5; j++) {
        std::cout << "* ";
    }
    std::cout << std::endl;
}
// 输出:
// * * * * *
// * * * * *
// * * * * *

5.2 打印三角形 #

cpp
// 直角三角形
for (int i = 1; i <= 5; i++) {
    for (int j = 1; j <= i; j++) {
        std::cout << "* ";
    }
    std::cout << std::endl;
}
// 输出:
// *
// * *
// * * *
// * * * *
// * * * * *

5.3 打印菱形 #

cpp
int n = 5;

// 上半部分
for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n - i; j++) {
        std::cout << " ";
    }
    for (int j = 1; j <= 2 * i - 1; j++) {
        std::cout << "*";
    }
    std::cout << std::endl;
}

// 下半部分
for (int i = n - 1; i >= 1; i--) {
    for (int j = 1; j <= n - i; j++) {
        std::cout << " ";
    }
    for (int j = 1; j <= 2 * i - 1; j++) {
        std::cout << "*";
    }
    std::cout << std::endl;
}

5.4 二维数组遍历 #

cpp
int matrix[3][4] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};

for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 4; j++) {
        std::cout << matrix[i][j] << " ";
    }
    std::cout << std::endl;
}

六、循环选择指南 #

6.1 while适用场景 #

  • 不确定循环次数
  • 需要先判断条件
  • 读取输入直到特定值
cpp
// 读取输入
while (std::cin >> value && value != 0) {
    // 处理
}

6.2 do-while适用场景 #

  • 至少执行一次
  • 输入验证
  • 菜单选择
cpp
// 输入验证
do {
    std::cin >> value;
} while (value < 0);

6.3 for适用场景 #

  • 已知循环次数
  • 需要索引
  • 遍历数组
cpp
// 已知次数
for (int i = 0; i < n; i++) {
    // 处理
}

6.4 范围for适用场景 #

  • 遍历容器
  • 不需要索引
  • 代码简洁
cpp
// 遍历容器
for (const auto& item : container) {
    // 处理
}

七、最佳实践 #

7.1 避免无限循环 #

cpp
// 错误:忘记更新循环变量
int i = 0;
while (i < 10) {
    std::cout << i << std::endl;
    // 忘记 i++
}

// 正确
int i = 0;
while (i < 10) {
    std::cout << i << std::endl;
    i++;
}

7.2 使用有意义的变量名 #

cpp
// 不推荐
for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
        // ...
    }
}

// 推荐
for (int row = 0; row < rows; row++) {
    for (int col = 0; col < cols; col++) {
        // ...
    }
}

7.3 优先使用范围for #

cpp
// 不推荐
for (size_t i = 0; i < vec.size(); i++) {
    std::cout << vec[i] << std::endl;
}

// 推荐
for (const auto& item : vec) {
    std::cout << item << std::endl;
}

7.4 避免修改循环变量 #

cpp
// 不推荐
for (int i = 0; i < 10; i++) {
    i++;  // 在循环体内修改循环变量
}

// 推荐
for (int i = 0; i < 10; i += 2) {
    // 在更新部分修改
}

八、总结 #

循环语句对比 #

循环类型 执行次数 适用场景
while 0次或多次 不确定次数,先判断
do-while 至少1次 至少执行一次
for 0次或多次 已知次数,需要索引
范围for 0次或多次 遍历容器

选择建议 #

  1. 已知次数 → for
  2. 遍历容器 → 范围for
  3. 先判断条件 → while
  4. 至少执行一次 → do-while

下一步,让我们学习循环控制!

最后更新:2026-03-26