【问题标题】:Why does C have both logical and bitwise ‘or’ operators?为什么 C 语言既有逻辑运算符又有按位“或”运算符?
【发布时间】:2020-04-07 03:19:38
【问题描述】:

为什么 C 有 || 和 | 运算符?据我所知,| 运算符可以在条件中替换||,因为当至少有一个操作数为非零时,它将返回真(非零)值。

我只是出于好奇而问。我知道我应该使用 || 来表示逻辑表达式。

示例

#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;
}

【问题讨论】:

  • || 短路,| 没有。
  • 一个关键的区别是|| 保证短路:这意味着如果第一个比较为真,它知道它不必检查第二个。很多代码依赖于||和&amp;&amp;的这种短路操作
  • @EugeneSh。我以为3 | 4 会是 7。
  • @jiwopene 哎呀。当然是指&amp;/&amp;&amp;。已编辑,谢谢
  • @jiwopene 我认为该问题的答案以及问题本身也为您的关注提供了很好的答案:stackoverflow.com/questions/29810766/…

标签: c if-statement bitwise-operators logical-operators


【解决方案1】:

|| 和 | 是截然不同的野兽。

除了|| 具有短路属性(右操作数仅在左操作数计算为 0 时计算)之外,它也是一个排序点。

表达式的值也可以不同:例如1 || 2 是1 而1 | 2 是3。

(请注意&amp;&amp; 和&amp; 有更有害的区别,例如1 &amp;&amp; 2 是1 而1 &amp; 2 是0。)

【讨论】:

    【解决方案2】:

    除了|| 运算符是短路的事实之外,|| 运算符的结果始终是 0 或 1 基于其真实性,而按位或 @ 的结果987654325@ 运算符将是在操作数中设置的位的组合,不一定是1(即0x0A | 0xB0 = 0xBA,而0x0A || 0xB0 = 1。

    §6.5.14 逻辑或运算符

    ||如果任一操作数比较不等于 0,则运算符应产生 1;否则,它产生 0。结果的类型为 int。

    §6.5.12 按位包含 OR 运算符

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-30
        • 1970-01-01
        • 1970-01-01
        • 2012-07-20
        • 1970-01-01
        相关资源
        最近更新 更多