为什么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;
}
zz315274061 回答:为什么C同时具有逻辑和按位“或”运算符?

|||是非常不同的野兽。

除了||具有短循环属性(仅当左边的操作数为0时才评估右边的操作数),它也是一个排序点。

表达式的值也可以不同:例如1 || 21,而1 | 23

(请注意,&&&的区别更大,例如1 && 21,而1 & 20。)

,

除了||运算符发生短路这一事实之外,根据其真相,||运算符的结果始终是01,而按位或|运算符的结果将是在操作数中设置的位的组合,不一定是1(即0x0A | 0xB0 = 0xBA,而0x0A || 0xB0 = 1

§6.5.14逻辑或运算符

  

||如果运算符的两个操作数都不等于0,则运算符应产生1;否则,结果为0。结果的类型为int。

§6.5.12按位或运算符

  

|的结果运算符是操作数的按位或运算符(即,   当且仅当转换后的相应位中至少有一位时才设置结果   操作数已设置)。

,

In BCPL and B-祖辈-,只有|&。但是它们的解释取决于上下文:在类似if的控制结构中,它们的行为类似于C逻辑运算符,在其他上下文中,它们的行为类似于C二进制运算符。认为这太难使用和解释了,因此引入了其他运算符,以便所使用的运算符清楚地表明该运算是逻辑短路还是二进制短路而不是短路短路。这也解释了比较运算符相对优先级的不便。

本文链接:https://www.f2er.com/2925634.html

大家都在问