控制流

翻译整理自 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 等,可读性更强。