第3.3章: if-else

English

if-else 语句

if 决定是否执行某条语句。 if-else 在两条语句之间做选择:


if (cond) {
    ;
} else {
    ;
}

和之前一样,; 只是一个空语句。

else if

当分支超过两个时,你可以用 else if 串联条件:


if (x < 0) {
    print("negative\n");
} else if (x == 0) {
    print("zero\n");
} else {
    print("positive\n");
}

只有第一个匹配的分支会执行。

初始化语句

if 或 else if 可以在条件之前声明变量。 C++ 允许两种不同的写法。 该变量只存在于整个 if / else if / else 链内部。

形式 1


::std::uint_least32_t a{3};
::std::uint_least32_t b{9};

if (::std::int_least32_t sum = a + b) {   // condition is: sum != 0
    println("sum != 0, a=", a, ", b=", b, ", sum=", sum);
} else {
    println("sum == 0, a=", a, ", b=", b, ", sum=", sum);
}

在这种形式中,条件就是该变量是否非零。

形式 2


if (auto sum = a + b; sum > 10) {
    println("sum > 10, a=", a, ", b=", b, ", sum=", sum);
} else if (sum == 10) {
    println("sum == 10, a=", a, ", b=", b, ", sum=", sum);
} else {
    println("sum < 10, a=", a, ", b=", b, ", sum=", sum);
}

在这种形式中,先声明变量,然后再检查一个独立的条件。

两种形式下,变量(sum)都在整条链结束后被销毁。

始终使用 { }

对 if、else if 和 else,初学者应当始终使用花括号。 不加花括号时,极易把 else 挂到错误的 if 上。

❌ 错误(有歧义)


if (a)
    if (b)
        ;
    else
        ;   // attaches to the inner if, not the outer one

这就是经典的“悬垂 else”问题。

✔️ 正确


if (a) {
    if (b) {
        ;
    } else {
        ;
    }
}

花括号让结构清晰,并防止出错。

另一个令人困惑的例子

不加花括号时,这段代码看起来像 else 属于第一个 if:

❌ 错误


if (x > 0)
    if (x == 1)
        print("one\n");
    else
        print("not one\n");  // actually belongs to the inner if

但 else 总是与最近的未匹配的 if 配对。

✔️ 正确


if (x > 0) {
    if (x == 1) {
        print("one\n");
    } else {
        print("not one\n");
    }
}

始终使用花括号。它消除了所有歧义。

要点