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 假设 xy 的字节值分别为 0x660x39。填写下表,指明各个 C 表达式的字节值。

表达式 表达式
x & y x && y
x \| y x \|\| y
~x \| ~y !x \|\| !y
x & !y x && ~y

练习题 2.15 只使用位级和逻辑运算,编写一个 C 表达式,它等价于 x == y。换句话说,当 xy 相等时它将返回 1,否则就返回 0。