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

4

为什么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;
}

5
|| 短路,| 不会。 - Federico klez Culloca
2
一个关键的区别是,使用 || 时保证短路:这意味着如果第一个比较为真,它就知道不必检查第二个。很多代码都依赖于 ||&& 的这种短路操作。 - Steve Friedl
@EugeneSh。我以为 3 | 4 应该是 7。 - jiwopene
@jiwopene 哎呀,我的意思是 &/&&。已经修改了,谢谢。 - Eugene Sh.
1
@jiwopene 我认为那个问题的答案以及问题本身都对你的疑虑提供了很好的回答:https://stackoverflow.com/questions/29810766/what-is-the-difference-between-bitwise-and-logical-operators-inside-conditional - RobertS supports Monica Cellio
显示剩余5条评论
3个回答

8

||| 是两个完全不同的东西。

除了 || 具有短路属性(只有在左操作数评估为 0 时才评估右操作数),它也是一个顺序点。

表达式的值也可能不同:1 || 2 的值是 1,而 1 | 2 的值是 3

(请注意,&&& 有更加恶劣的差异,例如 1 && 21,而 1 & 20。)


3
除了逻辑运算符||具有短路特性外,它的结果基于其真值始终为01。而位或|运算符的结果将是在操作数中设置的比特位的组合,其不一定为1(即0x0A | 0xB0 = 0xBA,而0x0A || 0xB0 = 1)。 §6.5.14 逻辑或运算符

如果任一操作数与0不相等,则||运算符返回1;否则返回0。结果的类型为int。

§6.5.12 位或运算符

|运算符的结果是操作数的按位包含或(即,如果转换后的操作数中对应的比特至少有一个被设置,则结果中的每个比特都将被设置)。


1

{{link1:在BCPL和B——C的祖先中,只有|&。但它们的解释取决于上下文:在诸如if的控制结构中,它们的行为类似于C逻辑运算符,在其他情况下,它们的行为类似于C二进制运算符。这被认为使用和解释都太困难了,因此引入了其他运算符,以便所使用的运算符清楚地指示操作是逻辑和短路还是二进制且不短路。这也解释了比较运算符的相对优先级不方便的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接