2.1.8 C 语言中的逻辑运算
2.1.8 C 语言中的逻辑运算
C 语言还提供了一组逻辑运算符 ||、&& 和 !,分别对应于命题逻辑中的 OR、AND 和 NOT 运算。逻辑运算很容易和位级运算相混淆,但是它们的功能是完全不同的。逻辑运算认为所有非零的参数都表示 TRUE,而参数 0 表示 FALSE。它们返回 1 或者 0,分别表示结果为 TRUE 或者为 FALSE。以下是一些表达式求值的示例。
| 表达式 | 结果 |
|---|---|
!0x41 |
0x00 |
!0x00 |
0x01 |
!!0x41 |
0x01 |
0x69&&0x55 |
0x01 |
0x69\|\|0x55 |
0x01 |
可以观察到,按位运算只有在特殊情况下,也就是参数被限制为 0 或者 1 时,才和与其对应的逻辑运算有相同的行为。
逻辑运算符 && 和 || 与它们对应的位级运算 & 和 | 之间第二个重要的区别是,如果对第一个参数求值就能确定表达式的结果,那么逻辑运算符就不会对第二个参数求值。因此,例如,表达式 a && 5/a 将不会造成被零除,而表达式 p && *p++ 也不会导致间接引用空指针。
练习题 2.14 假设 x 和 y 的字节值分别为 0x66 和 0x39。填写下表,指明各个 C 表达式的字节值。
| 表达式 | 值 | 表达式 | 值 |
|---|---|---|---|
x & y |
x && y |
||
x \| y |
x \|\| y |
||
~x \| ~y |
!x \|\| !y |
||
x & !y |
x && ~y |
练习题 2.15 只使用位级和逻辑运算,编写一个 C 表达式,它等价于 x == y。换句话说,当 x 和 y 相等时它将返回 1,否则就返回 0。