【问题标题】:Why is && at a higher precedence than || (Java)为什么 && 的优先级高于 || (爪哇)
【发布时间】:2014-01-17 14:43:02
【问题描述】:
    boolean a = true;
    boolean b = true;
    boolean c = false;

    System.out.println(a || b && c); // true
    System.out.println(b && c || a); // true

我最近才发现这里有点奇怪。为什么&&|| 处于不同的优先级?我会假设他们处于同一水平。以上说明了这一点。这两个陈述都是正确的,即使从左到右的评估结果第一个为假,第二个为真。

有人知道这背后的原因吗?

(顺便说一句,我会在这里使用大量括号,但这是旧代码提出的问题)

【问题讨论】:

标签: java operator-precedence


【解决方案1】:

这是此类运算符的惯用优先顺序。其他语言(例如 C++)也具有相同的优先顺序。数学符号也是如此,请参阅here

【讨论】:

    【解决方案2】:

    因为在传统的数学符号中,and (logical conjunction) 的优先级高于 or (logical disjunction)。

    出于显而易见的原因,所有非深奥的编程语言都将反映此类事情的现有约定。

    【讨论】:

    • 明白了。这只是我直到今天才遇到的事情。我有一个同事问我“哪个优先级更高”。
    【解决方案3】:

    && 是乘法的布尔模拟 (x && y == x * y),而 || 是加法的布尔模拟 (x || y == (bool)(x + y))。由于乘法的优先级高于加法,因此使用相同的约定。

    请注意,布尔表达式最常见的“规范”形式是一堆 or-ed 在一起的 and-从句,因此这与它非常吻合。

    【讨论】:

    • 注意有两个 canonical normal forms;积和积。
    • 因此是“最常见的”说明符。 (虽然我认为这可能取决于子学科。)
    • 既然你提到了它,我已经在我的 EE 课程中看到了这一点。谢谢,有道理。
    猜你喜欢
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    相关资源
    最近更新 更多