关系操作符和逻辑操作符使用算术或指针类型的操作数,并返回bool 类型的值。
操作符 |
功能 |
用法 |
! |
logical NOT(逻辑非) |
!expr |
< |
less than(小于) |
expr < expr |
<= |
less than or equal(小于等于) |
expr <= expr |
> |
greater than(大于) |
expr > expr |
>= |
greater than or equal(大于等于) |
expr >= expr |
== |
equality(相等) |
expr == expr |
!= |
inequality(不等) |
expr != expr |
&& |
logical AND(逻辑与) |
expr && expr |
|| |
logical OR(逻辑或) |
expr || expr |
expr1 && expr2 // logical AND
expr1 || expr2 // logical OR
对于&&运算符当且仅当两个运算对象都为真时结果为真;
对于逻辑||运算符,只要两个运算对象中的一个为真,结果就为真。
逻辑与和逻辑或操作符总是先计算其左操作数,然后再计算其右操作数。只有在仅靠左操作数的值无法确定该逻辑表达式的结果时, 才会求解其右操作数。 我们常常称这种求值策略为“短路求值(short-circuit evaluation)”。
对于逻辑与&&来说,当且仅当左侧运算对象为真时才对右侧对象求值;
对于逻辑或||来说,当且仅当左侧运算对象为假时才对右侧对象求值。
逻辑非操作符逻辑非操作符(!)将其操作数视为条件表达式,产生与其操作数值相反的条件值。
关系操作符关系操作符(<、<=、>、<=)具有左结合特性。事实上,由于关系操作符返回 bool 类型的结果,因此很少使用其左结合特性。如果把多个关系操作符串接起来使用,结果往往出乎预料:
if (i < j < k) { /* ... */ }
这种写法只要 k 大于 1,上述表达式的值就为 true。这是因为第二个小于操作符的左操作数是第一个小于操作符的结果:true 或 false。也就是,该条件将 k 与整数 0 或 1 做比较。为了实现我们想要的条件检验,应重写上述表达式如下:
if (i < j && j < k) { /* ... */ }
如果想测试一个算术对象或指针对象的真值,最直接的方法就是将其作为if语句的条件:
if(val)
if(!val)
有时会试图将上面的真值测试写成:
if (val == true)
但这种写法存在两个问题:
首先,与之前的代码相比,这种写法较长;
其次,如果val不是布尔值,这样的比较将失去原来的意义,比较之前会将true转换成val类型,也就是说,如果val不是布尔值,则代码可以改写为:
if(val==1)