选择语句

  一个值可以被if语句或者switch语句检测:

    if(condition) statement
    if(condition) statement else statement
    switch(condition) statement

比较运算符

==        !=        <        <=        >        >=

在比较结果为真时返回bool值true;否则就返回false。

  对于if语句,如果条件表达式(condition)非0则(只)执行第一个语句(statement),否则就(只)执行第二个语句。这也意味着任何算术或者指针表达式都可以用做条件。例如,如果x是个整数,那么

if(x) // ...

的意思就是

if(x != 0) // ...

对于指针p

if(p) // ...

就是直接检测“p是指向一个合法对象”(假定p经过正确的初始化)的语句,而

if(p != 0) // ...

则是通过与一个明确地不指向任何对象的值相比较,从而间接地陈述了同一个问题。请注意,指针0的表示未必在所有机器上都是全0(5.1.1节)。但我检查过的所有编译器对于这两种写法生成的代码都完全一样。

  逻辑运算符

&&        ||        !

最经常被用在条件里。运算符 && 和 || 除了在必要之时,是不会去对其第二个运算对象求值的。例如,

if(p && 1 < p->count) // ...

首先检查p是否非0,只有在p非0的情况下才检测1 < p->count。

  某些if语句可以很方便地用条件表达式取代。例如,

    if(a <= b)
        max = b;
    else
        max = a;

写成下面的形式更好些:

max = (a <= b) ? b : a;

括着条件表达式的括号并不必要,但我觉得,写了它们可以使代码更容易读一些。

  switch语句可以作为写一组if语句的另一种方式。例如,

    switch(val) {
    case 1:
        f();
        break;
    case 2:
        g();
        break;
    default:
        h();
        break;
    }

也可以等价地表述为

    if(val == 1)
        f();
    else if(val == 2)
        g();
    else
        h();

两者意义相同,但是第一个(用switch的)版本更好一些,因为操作的性质(相对于一组常量检测一个值)表现得更明显。这也使对于一些比较复杂的例子而言,switch语句更容易阅读。它也可能导致生成更好的代码。

  请当心,switch语句中的每个case必须以某种方式终止,除非你希望让执行进入下一个case中。考虑

    switch(val) {            // 当心
    case 1:
        cout << "case 1\n";
    case 2:
        cout << "case 2\n";
    default:
        cout << "default: case not found\n";
    }

如果val == 1,它将打印出

case 1
case 2
default: case not found

这会把没准备的人吓一跳。给那些(罕见的)让执行掉进下一个case的情况加上注释,说明这样做是有意的,这是一个很好的建议,页使无意中掉下去被假定为一个错误。最常见的结束case的方式是用break语句,但是return页常常被使用(6.1.1节)。

🔚