为什么C同时有||
运算符和|
运算符?据我所知,|
运算符可以在条件下替换||
,因为当至少一个操作数为非零时,它将返回 true(非零(值。
我只是出于好奇问道。我知道我应该使用||
进行逻辑表达。
例
#include <stdio.h>
int main(void) {
int to_compare = 5;
/* Try with bitwise or */
if ((5 > to_compare) | (to_compare == 6)) {
printf("‘to_compare’ is less than or equal to 5 or equal to 6.n");
}
/* Try with logical or */
if ((5 > to_compare) || (to_compare == 6)) {
printf("‘to_compare’ is less than or equal to 5 or equal to 6.n");
}
return 0;
}
||
和|
是非常不同的野兽。
除了具有短循环属性的||
(仅当左侧操作数的计算结果为 0 时才计算右操作数(之外,它也是一个排序点。
表达式的值也可以不同:例如1 || 2
是1
,而1 | 2
是3
。
(请注意,&&
和&
具有更有害的区别,例如1 && 2
是1
而1 & 2
是0
。
除了||
运算符短路的事实之外,||
运算符的结果总是基于其真实值0
或1
,而按位运算符或|
运算符的结果将是操作数中设置的位的组合,这不一定是1
的(即0x0A | 0xB0 = 0xBA
,而0x0A || 0xB0 = 1
.
§6.5.14 逻辑 OR 运算符
如果 || 运算符的任一操作数比较不等于 0,则其应生成 1;否则,它将生成 0。结果的类型为 int。
§6.5.12 按位包含 OR 运算符
| 运算符的结果是操作数的按位包含 OR(即,每个位 当且仅当转换后的相应位中至少有一个时,设置结果 设置操作数(。
在 BCPL 和 B 中 -- C 祖先--,只有|
和&
。 但是它们的解释取决于上下文:在像if
这样的控制结构中,它们的行为类似于C逻辑运算符,在其他上下文中,它们的行为类似于C二元运算符。 这被认为太难使用和解释,因此在引入时增加了运算符,以便所使用的运算符清楚地表明操作是逻辑和短路,还是二进制而不是短路。 这也解释了比较运算符的相对优先级不方便。