C++提供了3种逻辑运算符,来组合或修改已有的表达式:逻辑OR(||)、逻辑AND(&&)和逻辑NOT(!)
#####################################################
逻辑OR运算符的优先级比关系运算符低,故
5 == 5 || 5 == 9 等价于 (5 == 5) || (5 == 9)
C++规定,||运算符是个顺序点(sequence point)。也就是说,先修改左侧的值,再对右侧的值进行判定。另外,如果左侧的表达式为true,则C++将不会去判定右侧的表达式,因为只要一个表达式为true,则整个逻辑表达式为true
|
Expr1||expr2的值 |
|
|
Expr1 == true |
Exptr1 == false |
Expr2 == true |
True |
true |
Expr2 == false |
true |
False |
####################################################
逻辑AND运算符(&&),是将两个表达式组合成一个表达式。仅当原来的两个表达式都为true时,得到的表达式的值才为true
由于&&的优先级低于关系运算符,故
5 == 5 && 4 ==4 等价于 (5 == 5) && (4 == 4)
和||运算符一样,&&运算符也是顺序点,因此将首先判定左侧,并且在右侧被判定之前产生所有的副作用。如果左侧为false,则整个逻辑表达式必定为false,在这种情况下,C++将不会再对右侧进行判定
|
Expr1 && expr2的值 |
|
|
Expr1 == true |
Expr1 == false |
Expr2 == true |
True |
false |
Expr2 == false |
false |
False |
#################################################
!运算符将它后面的表达式的真值取反
例如,如果C-风格字符串s1和s2不同,则strcmp(s1, s2)将返回非零(true)值,否则返回0。这意味着如果这两个字符串相同,则!strcmp(s1, s2)为true
!运算符的优先级高于所有的关系运算符和算术运算符。因此,要对表达式求反,必须用括号将其括其。