跳转到主要内容

流程控制

程序由若干条语句组成,程序的执行顺序称为流程。C++ 提供了三种基本流程结构,以及若干跳转语句来灵活控制程序走向:

    顺序结构:语句自上而下依次执行。 选择结构(分支结构):根据条件决定执行哪一条分支。 循环结构:在满足条件时重复执行某段代码。 跳转语句:break、continue、goto、return,用于改变流程走向。

    一、顺序结构

    顺序结构是最基本的流程结构,代码按照书写的先后顺序从上到下逐条执行。

    #include <iostream>
    using namespace std;
    
    int main() {
        int a = 10;
        int b = 20;
        int sum = a + b;          // 先计算
        cout << "sum = " << sum << endl;  // 再输出
        return 0;
    }
    

    输出:

    sum = 30
    

    二、选择结构

    选择结构根据条件表达式的真假,选择性地执行不同的代码块。条件表达式中,0 表示假(false),非 0 表示真(true)。

    2.1 if 语句

    语法:

    if (条件表达式) {
        // 条件为真时执行的语句
    }
    

    示例:

    int score = 85;
    if (score >= 60) {
        cout << "及格" << endl;
    }
    

    2.2 if-else 语句

    语法:

    if (条件表达式) {
        // 条件为真
    } else {
        // 条件为假
    }
    

    示例:

    int num = 7;
    if (num % 2 == 0) {
        cout << num << " 是偶数" << endl;
    } else {
        cout << num << " 是奇数" << endl;
    }
    

    2.3 if-else if-else 多分支

    语法:

    if (条件1) {
        // 条件1成立
    } else if (条件2) {
        // 条件2成立
    } else if (条件3) {
        // 条件3成立
    } else {
        // 以上都不成立
    }
    

    示例(成绩等级判定):

    int score = 85;
    if (score >= 90) {
        cout << "优秀" << endl;
    } else if (score >= 80) {
        cout << "良好" << endl;
    } else if (score >= 60) {
        cout << "及格" << endl;
    } else {
        cout << "不及格" << endl;
    }
    

    注意:多分支按顺序自上而下判断,一旦某个条件成立,后面的分支将不再判断。因此条件的顺序很重要(例如先判断 >= 90 再判断 >= 80)。

    2.4 嵌套 if

    在一个 if 内部再写 if,即嵌套分支。示例:判断一个数是否为三个数中的最大值。

    int a = 3, b = 8, c = 5;
    if (a >= b) {
        if (a >= c) {
            cout << "最大值是 " << a << endl;
        } else {
            cout << "最大值是 " << c << endl;
        }
    } else {
        if (b >= c) {
            cout << "最大值是 " << b << endl;
        } else {
            cout << "最大值是 " << c << endl;
        }
    }
    

    悬挂 else 问题:else 总是与它前面最近的、尚未配对的 if 配对。建议始终使用花括号 {} 明确代码块范围,避免歧义。

    2.5 switch 语句

    switch 适合根据一个整型或枚举表达式的多个固定取值进行分支。

    语法:

    switch (表达式) {
        case 常量1:
            // 语句
            break;
        case 常量2:
            // 语句
            break;
        default:
            // 其他情况
            break;
    }
    

    示例(根据数字输出星期):

    int day = 3;
    switch (day) {
        case 1: cout << "星期一" << endl; break;
        case 2: cout << "星期二" << endl; break;
        case 3: cout << "星期三" << endl; break;
        case 4: cout << "星期四" << endl; break;
        case 5: cout << "星期五" << endl; break;
        case 6: cout << "星期六" << endl; break;
        case 7: cout << "星期日" << endl; break;
        default: cout << "非法输入" << endl; break;
    }
    

    switch 的要点:

      switch 的表达式只能是整型(int、char、enum 等)或可隐式转换为整型的类型,不能是浮点数或字符串。 case 后面必须是常量表达式,各 case 的值不能重复。 break 的作用是跳出 switch。如果省略 break,程序会继续执行下一个 case 的语句,这称为case 穿透(fall-through)。有时可利用穿透实现多个值共享同一段逻辑:
      char grade = 'B';
      switch (grade) {
          case 'A':
          case 'B':
              cout << "良好及以上" << endl;  // A 和 B 都执行这里
              break;
          case 'C':
              cout << "及格" << endl;
              break;
          default:
              cout << "其他" << endl;
      }
      

      2.6 三目运算符 ?:

      三目运算符是一个简洁的条件表达式:

      结果 = 条件 ? 值1 : 值2;
      

      条件为真取 值1,否则取 值2。示例:

      int a = 10, b = 20;
      int max = (a > b) ? a : b;   // max = 20
      cout << "较大值:" << max << endl;
      

      if 与 switch 对比

      特性 if / else if switch 判断类型 任意布尔条件、范围判断 整型/枚举的相等比较 表达式 可以是关系、逻辑表达式 只能是比较具体的值 可读性 范围判断清晰 多固定值分支更清晰 穿透行为 无 有(需 break 控制)

      三、循环结构

      循环结构用于重复执行某段代码,直到条件不再满足。C++ 有三种循环语句:for、while、do-while。

      3.1 for 循环

      适合已知循环次数的场景。

      语法:

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

      执行流程:初始化 → 判断条件 → 执行循环体 → 迭代更新 → 再判断条件……

      示例(求 1 到 100 的和):

      int sum = 0;
      for (int i = 1; i <= 100; i++) {
          sum += i;
      }
      cout << "1+2+...+100 = " << sum << endl;  // 5050
      

      3.2 while 循环

      适合循环次数不确定、依赖条件的场景。先判断条件,再执行循环体。

      语法:

      while (循环条件) {
          // 循环体
      }
      

      示例(求一个整数的各位数字之和):

      int n = 12345;
      int sum = 0;
      while (n > 0) {
          sum += n % 10;   // 取个位
          n /= 10;         // 去掉个位
      }
      cout << "各位之和:" << sum << endl;  // 15
      
      3.3 do-while 循环
      
      先执行一次循环体,再判断条件。**无论条件是否成立,循环体至少执行一次。**
      
      语法:
      
      ```cpp
      do {
          // 循环体
      } while (循环条件);   // 注意结尾的分号
      

      示例(至少执行一次的输入校验):

      int input;
      do {
          cout << "请输入一个正整数:";
          cin >> input;
      } while (input <= 0);
      cout << "你输入的是:" << input << endl;
      

      3.4 范围 for 循环(C++11)

      用于遍历数组或容器中的每个元素,语法更简洁。

      int arr[] = {1, 2, 3, 4, 5};
      for (int x : arr) {
          cout << x << " ";
      }
      // 输出:1 2 3 4 5
      

      如果需要修改元素,需使用引用 &:

      for (int &x : arr) {
          x *= 2;   // 每个元素翻倍
      }
      

      3.5 嵌套循环

      一个循环内部再包含另一个循环。常用于多维数据处理,如打印图形、矩阵。

      示例(打印九九乘法表):

      for (int i = 1; i <= 9; i++) {
          for (int j = 1; j <= i; j++) {
              cout << j << "*" << i << "=" << i * j << "\t";
          }
          cout << endl;
      }
      

      三种循环对比

      循环 判断时机 最少执行次数 适用场景 for 先判断后执行 0 次 已知循环次数 while 先判断后执行 0 次 次数不定、依赖条件 do-while 先执行后判断 1 次 至少执行一次

      四、跳转语句

      4.1 break

        在循环中:立即跳出当前层循环,不再继续。 在 switch 中:结束 switch 分支。

        示例(查找第一个能被 7 整除的数):

        for (int i = 1; i <= 100; i++) {
            if (i % 7 == 0) {
                cout << "第一个能被 7 整除的数:" << i << endl;  // 7
                break;   // 找到后立即跳出循环
            }
        }
        

        break 只能跳出当前一层循环;嵌套循环中需配合其他手段跳出多层。

        4.2 continue

        跳过本次循环中 continue 之后的语句,直接进入下一次循环的条件判断。

        示例(输出 1~10 中的奇数):

        for (int i = 1; i <= 10; i++) {
            if (i % 2 == 0) {
                continue;   // 偶数跳过
            }
            cout << i << " ";
        }
        // 输出:1 3 5 7 9
        

        4.3 goto

        无条件跳转到同一函数内的某个标号处。现代 C++ 中一般不推荐使用,会破坏程序结构、降低可读性,仅在某些跳出多层循环的场景偶尔使用。

        语法:

        goto 标号;
        ...
        标号:
            // 语句
        

        示例:

        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                if (i * j == 12) {
                    cout << "找到: i=" << i << ", j=" << j << endl;
                    goto end;   // 直接跳出两层循环
                }
            }
        }
        end:
            cout << "循环结束" << endl;
        

        4.4 return

        结束当前函数的执行,并将结果(若有)返回给调用者。在 main 函数中执行 return 0; 表示程序正常结束。

        int add(int a, int b) {
            return a + b;   // 返回后函数立即结束
        }
        

        五、综合实例

        实例 1:判断是否为素数

        #include <iostream>
        using namespace std;
        
        int main() {
            int n;
            cin >> n;
            bool isPrime = (n > 1);
            for (int i = 2; i * i <= n; i++) {
                if (n % i == 0) {
                    isPrime = false;
                    break;
                }
            }
            cout << n << (isPrime ? " 是素数" : " 不是素数") << endl;
            return 0;
        }
        

        实例 2:简单的菜单选择(switch + 循环)

        #include <iostream>
        using namespace std;
        
        int main() {
            int choice;
            do {
                cout << "\n=== 菜单 ===" << endl;
                cout << "1. 打招呼" << endl;
                cout << "2. 显示版本" << endl;
                cout << "0. 退出" << endl;
                cout << "请选择:";
                cin >> choice;
        
                switch (choice) {
                    case 1: cout << "你好,欢迎学习 C++!" << endl; break;
                    case 2: cout << "版本 1.0" << endl; break;
                    case 0: cout << "再见!" << endl; break;
                    default: cout << "无效选项,请重新输入" << endl; break;
                }
            } while (choice != 0);
            return 0;
        }
        

        六、注意事项与最佳实践

          条件表达式:C++ 中 0 为假,非 0 为真;但判断相等时务必用 ==,不要误写成赋值 =。 浮点数比较:不要直接用 == 比较两个 float/double,由于精度问题易出错,应判断差值是否足够小,如 fabs(a - b) < 1e-6。 避免死循环:while/for 循环体中要确保循环条件最终会变为假,否则会造成死循环。 花括号习惯:即使循环体或分支只有一条语句,也建议使用 {},可避免悬挂 else 等问题,也便于后期修改。 switch 记得 break:除非有意利用 case 穿透,否则每个 case 末尾都要写 break。 少用 goto:优先使用结构化控制语句(break、continue、函数封装)替代 goto。 循环变量作用域:在 for (int i = ...) 中声明的 i 只在循环内有效,这是推荐写法。

          七、小结

          结构 关键字 作用 顺序结构 — 按顺序依次执行 选择结构 if / else / switch 根据条件选择分支 循环结构 for / while / do-while 重复执行代码 跳转语句 break / continue / goto / `return