【问题标题】:why Operator precedence `and` higher then `or`为什么运算符优先级`and`高于`or`
【发布时间】:2016-04-04 00:52:37
【问题描述】:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence

如果and 高于or,1||alert(1)&&alert(2) 会提醒但不会

我觉得他们是一样的

【问题讨论】:

  • 为什么你认为它会是0?如果and 具有更高的优先级,它应该是1,如果or 具有更高的优先级,它也应该是1。
  • @slebetman 如果|| 具有更高的优先级,它实际上是2
  • @zerkms:啊,没错
  • 试试是1||(alert(1))&&alert(2)
  • 1||(alert(1))&&alert(2) 按预期返回1 并且不发出任何警报

标签: javascript


【解决方案1】:

看表达式:

1||0&&2

表达式同下:

1||(0&&2)//because && has greater precedence than ||

在这种情况下,1 是真实值,所以你得到 1。

所以,在优先规则下,这不会像下面这样:

(1||0)&&2//because || has lesser precedence than &&

【讨论】:

  • 我认为您的意思是在两个 cmets 中都写“更大”。因为它是顶部和底部的评论都说 && 具有更高的优先级(|| 具有较低的优先级意味着与 && 具有更高的优先级相同)
  • 没有。它只是说 && 具有更高的优先级。
  • 好吧,在这种情况下,示例 2 中的注释没有意义,因为在该示例中,大括号 ||具有更大的优先级,而不是更少。还是我误解了你的意思?
  • 我的意思是根据优先规则,表达式 1||0&&2 将是 1||(0&&2) 而不是 (1||0)&&2。
  • 是的。但是第二个例子中的注释是什么意思呢?因为它在说“因为 && 比 || 具有更大的优先级”与上面的评论相同
【解决方案2】:

原因很简单,乘法先于加法,我希望你知道...and 是逻辑乘积,or 是逻辑加法。

因此,您可以使用逻辑运算符重写您的操作(a||b&&c),例如:

a + b * c

如果 a、b 和 c 是布尔值,并且您应用正确的布尔运算,它会给您正确的结果。如果您愿意,可以将其转换为一位二进制:

&& => 1 * 1 is true, all others are false

|| => 0 + 0 is false, all others are true

【讨论】:

    【解决方案3】:

    为什么运算符优先级 and 高于 or

    因为这就是语言的定义方式。如果这让您感到困扰,请随意添加括号以使分组清晰。

    许多其他语言都以这种方式工作。

    记忆具有更高优先级的规则是将&& 视为乘法,将|| 视为加法(从逻辑意义上讲,它们是)。当然,乘法比加法具有更高的优先级(绑定更紧密)。

    【讨论】:

    • 它不仅是语言,而且在简单的数学运算中,我们认为and 的优先级高于or
    猜你喜欢
    • 2019-01-17
    • 1970-01-01
    • 2023-01-31
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    • 1970-01-01
    相关资源
    最近更新 更多