为什么 C 同时具有逻辑运算符和按位"或"运算符?



为什么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 || 21,而1 | 23

(请注意,&&&具有更有害的区别,例如1 && 211 & 20

除了||运算符短路的事实之外,||运算符的结果总是基于其真实值01,而按位运算符或|运算符的结果将是操作数中设置的位的组合,这不一定是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二元运算符。 这被认为太难使用和解释,因此在引入时增加了运算符,以便所使用的运算符清楚地表明操作是逻辑和短路,还是二进制而不是短路。 这也解释了比较运算符的相对优先级不方便。

相关内容

  • 没有找到相关文章

最新更新