
2.5.3 逻辑操作符的操作次序
正如对算术操作符的执行次序有控制规则,对逻辑操作符的执行次序也有控制规则。而对于每个关系操作符,则没有先后次序之分。
如果表达式有一个以上的逻辑操作符,那么NOT操作符最先执行,然后是AND操作符,最后是OR操作符。在一个混合有算术、关系和逻辑操作符的表达式中,如果有圆括号,就最先执行圆括号里的操作。如果没有圆括号,就首先执行算术操作,然后是关系操作,最后是依次执行NOT、AND和OR。表2-5总结了这个操作优先级。
表2-5 操作优先级
逻辑操作符允许程序的判断式使用一个以上的单个条件,复杂表达式是一个组合两个或更多可能条件的表达式。例如,一个商店可能送出一个促销折扣码,可用于购买额超过$50.00的客户。因此,使用折扣要满足两个条件:一是客户录入的折扣码要匹配商店送出的折扣码,二是购买额超过$50.00。对应的表达式“折扣码正确AND购买额超过$50.00”就是一种复杂表达式。其他商店可能为客户提供免运费或者购买额10%折扣的优惠,对应的表达式“想要免运费OR想要10%折扣?”是另一种类型的复杂表达式。
例2.21展示在复杂表达式中如何使用操作优先级。
例2.21 在复杂表达式中使用操作优先级 假定Q=3和R=5,以下表达式是true还是false?
根据操作优先级,特别是逻辑操作符的操作次序(最先执行!,然后是&&,最后是||),可以为这个表达式插入一些圆括号以明确指出各个操作的执行次序:
对此先求简单的条件,知道Q>3是false,R<3是false,而(Q-R)<0是true。然后,通过将这些值(true或false)替换到给定的表达式,再执行逻辑操作,我们就能够求得答案。这个求值过程如下图表所示。
给定:(!(Q>3))||((R<3)&&((Q-R)<0))
步1:(!(false))||((false)&&(true))
步2:true||false
步3:true
这个表达式求值为true。