测试_第04章_流程控制.cpp

← 测试总览 · 目录

编译运行:clang++ -std=c++26 -Wall -Wextra -pthread 测试_第04章_流程控制.cpp -o t && ./t(需先 cd 测试/

// 第4章测试:流程控制
#include <print>
#include <string>
#include <vector>
#include <numeric>

int failures = 0;
#define CHECK(expr)                                                         \
    do {                                                                    \
        if (!(expr)) {                                                      \
            ++failures;                                                     \
            std::println("FAIL 第{}行: {}", __LINE__, #expr);              \
        }                                                                   \
    } while (0)

int classify(int score) {
    if (score >= 90) return 3;
    else if (score >= 60) return 2;
    else return 1;
}

std::string weekday(int day) {
    switch (day) {
        case 1: return "一";
        case 2: return "二";
        case 3: return "三";
        default: return "?";
    }
}

int main() {
    // 4.1 if/else
    CHECK(classify(95) == 3);
    CHECK(classify(60) == 2);
    CHECK(classify(59) == 1);

    // 4.2 C++17 if 初始化语句(作用域验证)
    int leaked = 0;
    if (int n = 42; n > 10) leaked = n;
    CHECK(leaked == 42);
    // 此处无法再访问 n(作用域已结束)——能编译就证明设计正确

    // 4.3 switch
    CHECK(weekday(3) == "三");
    CHECK(weekday(9) == "?");

    // 4.4 for
    int sum = 0;
    for (int i = 0; i < 5; ++i) sum += i;
    CHECK(sum == 10);

    // 范围 for
    std::vector<int> v{1, 2, 3};
    sum = 0;
    for (int x : v) sum += x;
    CHECK(sum == 6);
    for (int& x : v) x *= 10;                            // 引用修改
    CHECK(v[1] == 20);

    // 倒着数 + 步长
    std::vector<int> down;
    for (int i = 10; i >= 0; i -= 2) down.push_back(i);
    CHECK(down.size() == 6);                            // 10 8 6 4 2 0

    // 4.5 while / do-while
    int i = 0;
    while (i < 5) ++i;
    CHECK(i == 5);
    int j = 0;
    do { ++j; } while (false);
    CHECK(j == 1);                                      // do 至少执行一次

    // 4.6 break / continue
    std::vector<int> got;
    for (int n = 0; n < 10; ++n) {
        if (n == 3) continue;
        if (n == 7) break;
        got.push_back(n);
    }
    CHECK((got == std::vector<int>{0, 1, 2, 4, 5, 6}));

    // 嵌套循环提前退出(标志变量法)
    bool found = false;
    int at_i = -1, at_j = -1;
    int data[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
    for (int x = 0; x < 3 && !found; ++x)
        for (int y = 0; y < 3; ++y)
            if (data[x][y] == 5) { found = true; at_i = x; at_j = y; break; }
    CHECK(found && at_i == 1 && at_j == 1);

    // 4.7 死循环要有出口(while(true)+break 模式)
    int cnt = 0;
    while (true) {
        ++cnt;
        if (cnt >= 1000) break;
    }
    CHECK(cnt == 1000);

    if (failures == 0) std::println("全部通过");
    return failures;
}