编译运行: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;
}