控制流
翻译整理自 cppreference - 语句。
1. if / else
if (a > b) {
max = a;
} else if (a == b) {
/* ... */
} else {
max = b;
}带初始化的 if(C++17):
if (auto it = m.find(key); it != m.end()) {
use(it->second);
}constexpr if(C++17):
template <typename T>
void f(T x) {
if constexpr (std::is_integral_v<T>) {
// 编译期选择
} else {
// ...
}
}2. switch
switch (op) {
case '+':
result = a + b;
break;
case '-':
result = a - b;
break;
case '*':
[[fallthrough]]; // 显式穿透标注(C++17)
case 'x':
result = a * b;
break;
default:
std::cerr << "unknown op\n";
}3. while / do-while
while (n > 0) n--;
do {
n--;
} while (n > 0);4. for 与范围 for
for (int i = 0; i < n; ++i) { ... }
std::vector<int> v = {1, 2, 3};
for (int x : v) { // 范围 for(C++11)
std::cout << x;
}
for (const auto& x : v) { ... } // 只读
for (auto& x : v) { x *= 2; } // 修改
C++20 起初始化表达式可写:
for (auto v = getVec(); int x : v) {
std::cout << x;
}5. break / continue / goto / return
for (...) {
if (cond) break;
if (skip) continue;
if (err) goto cleanup;
}
cleanup:
free();6. 异常作为控制流(不推荐)
try {
// ...
} catch (const std::runtime_error& e) {
// ...
}异常只用于错误处理,不要用作控制流(性能差)。
小结
C++ 控制流与 C 类似,但多了 constexpr if、范围 for、初始化 if 等,可读性更强。