Chapter 9: Conditionals

条件语句用于基于不同的条件执行不同的语句块。

If语句

if语句仅在括号中的表达式计算为真时才会执行。在C++中,这不一定是布尔表达式。它可以计算为数值的任意表达式,在此情况下,零为假,而其它数值为真。

if (x < 1) {
    cout << x << " < 1";
}

要测试其它条件,if语句可以使用任意的else if子句进行扩展。

else if (x > 1) {
    cout << x << " > 1";
}

if语句可以在最后有一个else子句,从而如果前面所有表达式为假,则执行该子句。

else {
    cout << x << " == 1";
}

对于花括号,如果只需要执行一条条件语句,则花括号可以省略。然而,包括花括号是一个好主意,因为它们可以改进可读性。

if (x < 1)
    cout << x << " < 1";
else if (x > 1)
    cout << x << " > 1";
else
    cout << x << " == 1";

switch语句

switch语句检测一个整数与一系列case标签之间的相等性,并将执行传递给匹配的case。它可以包含任意数量的case子句以及一个用于其它所有情况的默认标签。

switch (x)
{
    case 0: cout << x << " is 0"; break;
    case 1: cout << x << " is 1"; break;
    default: cout << x << " is not 0 or 1"; break;
}

注意,每个case标签之后的语句以break关键字结束来略过switch的其它部分。如果break被留空,执行会继续到下一个case,如果需要以相同的方式处理多个case,则这会非常有用。

三目操作符

除了if与switch语句之外,还有一个三目操作符(?:),可以替换单个的if/else子句。此操作符需要三个表达式。如果第一个表达式为真,则计算第二个表达式并返回,如果为假,则计算第三个表达式并返回。

x = (x < 0.5) ? 0 : 1; // ternary operator (?:)

C++允许表达式用作单独的代码语句。因此,三目操作符不仅可以用表达式,而且可以用作语句。

(x < 0.5) ? x = 0 : x = 1; // alternative syntax

程序术语表达式指计算为一个值的代码,而语句是以分号或花括号封装的代码段。

初始化器

人们更喜欢将变量的作用域限定在变量所用的代码区间。这样,可以防止变量弄乱名字空间或是引起潜在的名字冲突。要辅助这一点,通过在条件之后添加初始化器,C++17引入了为if语句声明和初始化局部作用域变量的能力。这限定了变量的作用域,从而使其仅在if语句以及对应的else子句内可见。

int a = 2, b = 3;
// ...
if (int sum = a+b; sum == 5) {
    cout << sum << " is 5";
}

在C++17中,switch语句也可以使用初始化器。类似于if语句,这一特性通过将变量的作用域限定在switch语句内避免了潜在的名字冲突。

switch (int sum = a+b; sum) {
    case 5: cout << sum << " is 5"; break;
}