【问题标题】:false or true != true or false != true || false [duplicate]假或真!=真或假!=真||错误[重复]
【发布时间】:2014-02-17 06:39:51
【问题描述】:

今天弄了好久,终于找到原因了,但还是不明白逻辑

x = (complex expression evaluating to false) or (complex expression evaluating to true)

x => false

很奇怪……经过实验发现

false or true => false
true or false => true
false || true => true
true || false => true

我想我在代码中的数百个地方都使用了“或”运算符,老实说,我不再相信“或”了......

有人可以解释一下“逻辑”吗?

【问题讨论】:

  • 您的第二个块并不完全正确。你实际上有类似x = false or true; p x # => false 的东西,对吧?当分配发生时,你会感到困惑。简而言之,赋值只是另一个运算符,它在 before or 和 after || 处理。通常你想要||,但or 的语义有时仍然有用。

标签: ruby


【解决方案1】:

根据precedence 表or 的优先级低于=。因此x = true or false 将被评估为(x = true) or false。但|| 的优先级高于=,x = true || false 将被评估为x = (true || false)。

x = false or true
x # => false
x = false || true
x # => true

【讨论】:

    【解决方案2】:

    首先false or true、true or false、false || true和true || false都是true。如果你把它们输入到 irb 中,你会看到的。

    您的代码无法按预期运行的原因是or 与= 的优先级。 x = y or z 被解析为 (x = y) or z,而不是 x = (y or z)。对于||,它被解析为x = (y || z),因为|| 具有更高的优先级。

    【讨论】:

      【解决方案3】:
      x = ((complex expression evaluating to false) or (complex expression evaluating to true))
      # or
      x = (complex expression evaluating to false) || (complex expression evaluating to true)
      

      在这个表达式中

      x = (complex expression evaluating to false) or (complex expression evaluating to true)
      

      这里实际上是其中两个。首先是赋值

      x = (complex expression evaluating to false)
      

      如果赋值返回false,第二个表达式将被计算。但即使第二个表达式为真,x 也将是 false。

      这是因为or 的优先级低于=

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-05
        • 1970-01-01
        • 2014-09-07
        • 2019-01-30
        • 2014-10-18
        • 2020-12-06
        • 1970-01-01
        • 2015-03-30
        相关资源
        最近更新 更多