Chapter 9: Conditionals ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 条件语句用于基于不同的条件执行不同的语句块。 If语句 ============= if语句仅在括号中的表达式计算为真时才会执行。在C++中,这不一定是布尔表达式。它可以计算为数值的任意表达式,在此情况下,零为假,而其它数值为真。 .. code:: if (x < 1) { cout << x << " < 1"; } 要测试其它条件,if语句可以使用任意的else if子句进行扩展。 .. code:: else if (x > 1) { cout << x << " > 1"; } if语句可以在最后有一个else子句,从而如果前面所有表达式为假,则执行该子句。 .. code:: else { cout << x << " == 1"; } 对于花括号,如果只需要执行一条条件语句,则花括号可以省略。然而,包括花括号是一个好主意,因为它们可以改进可读性。 .. code:: if (x < 1) cout << x << " < 1"; else if (x > 1) cout << x << " > 1"; else cout << x << " == 1"; switch语句 =============== switch语句检测一个整数与一系列case标签之间的相等性,并将执行传递给匹配的case。它可以包含任意数量的case子句以及一个用于其它所有情况的默认标签。 .. code:: 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子句。此操作符需要三个表达式。如果第一个表达式为真,则计算第二个表达式并返回,如果为假,则计算第三个表达式并返回。 .. code:: x = (x < 0.5) ? 0 : 1; // ternary operator (?:) C++允许表达式用作单独的代码语句。因此,三目操作符不仅可以用表达式,而且可以用作语句。 .. code:: (x < 0.5) ? x = 0 : x = 1; // alternative syntax 程序术语表达式指计算为一个值的代码,而语句是以分号或花括号封装的代码段。 初始化器 =============== 人们更喜欢将变量的作用域限定在变量所用的代码区间。这样,可以防止变量弄乱名字空间或是引起潜在的名字冲突。要辅助这一点,通过在条件之后添加初始化器,C++17引入了为if语句声明和初始化局部作用域变量的能力。这限定了变量的作用域,从而使其仅在if语句以及对应的else子句内可见。 .. code:: int a = 2, b = 3; // ... if (int sum = a+b; sum == 5) { cout << sum << " is 5"; } 在C++17中,switch语句也可以使用初始化器。类似于if语句,这一特性通过将变量的作用域限定在switch语句内避免了潜在的名字冲突。 .. code:: switch (int sum = a+b; sum) { case 5: cout << sum << " is 5"; break; }