11-逻辑运算符细节
6.2.5 逻辑运算符细节
正如本章前面指出的,C++逻辑OR和逻辑AND运算符的优先级都低于关系运算符。这意味着下面的表达式
x > 5 && x < 10
将被解释为:
(x > 5) && (x < 10)
另一方面,!运算符的优先级高于所有的关系运算符和算术运算符。因此,要对表达式求反,必须用括号将其括起,如下所示:
!(x > 5) // is it false that x is greater than 5
!x > 5 // is !x greater than 5
第二个表达式总是为false,因为!x的值只能为true或false,而它们将被转换为1或0。
逻辑AND运算符的优先级高于逻辑OR运算符。因此,表达式:
age > 30 && age < 45 || weight > 300
被解释为:
(age > 30 && age < 45) || weight > 300
也是说,一个条件是age位于31~44,另一个条件是weight大于300。如果这两个条件中的一个或全部都为true,则整个表达式为true。
当然,还可以用括号将所希望的解释告诉程序。例如,假设要用&&将age大于50或weight大于300的条件与donation大于1000的条件组合在一起,则必须使用括号将OR部分括起:
(age > 50 || weight > 300) && donation > 1000
否则,编译器将把weight条件与donation条件(而不是age条件)组合在一起。
虽然C++运算符的优先级规则常可能不使用括号便可以编写复合比较的语句,但最简单的方法还是用括号将测试进行分组,而不管是否需要括号。这样代码容易阅读,避免读者查看不常使用的优先级规则,并减少由于没有准确记住所使用的规则而出错的可能性。
C++确保程序从左向右进行计算逻辑表达式,并在知道答案后立刻停止。例如,假设有下面的条件:
x != 0 && 1.0 / x > 100.0
如果第一个条件为false,则整个表达式肯定为false。这是因为要使整个表达式为true,每个条件都必须为true。知道第一个条件为false后,程序将不判定第二个条件。这个例子非常幸运,因为计算第二个条件将导致被0除,这是计算机没有定义的操作。