假或真!=真或假!=真||错误[重复]
Posted
技术标签:
【中文标题】假或真!=真或假!=真||错误[重复]【英文标题】: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
的语义有时仍然有用。
【参考方案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
的优先级低于=
【讨论】:
以上是关于假或真!=真或假!=真||错误[重复]的主要内容,如果未能解决你的问题,请参考以下文章