选择语句
一个值可以被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节)。
🔚