无法理解 ruby​​ 逻辑运算符的结果 [重复]

Posted

技术标签:

【中文标题】无法理解 ruby​​ 逻辑运算符的结果 [重复]【英文标题】:cannot understand the result of ruby logic operator [duplicate] 【发布时间】:2013-09-06 01:28:14 【问题描述】:

在 Ruby 中,找到如下代码是合理的:

a = 1 and b = 2 and c = 3
print "a = #a, b = #b, c = #c\n"

得到结果:

a = 1, b = 2, c = 3

但我不明白为什么这样的代码:

a = 1 && b = 2 && c = 3
print "a = #a, b = #b, c = #c\n"

结果是:

a = 3, b = 3, c = 3

谁能帮我澄清一下?

【问题讨论】:

这两段代码只是给我一个SyntaxError。我没有得到你看到的结果。 感谢 Andrew 编辑,看起来更好 【参考方案1】:

&& 运算符的优先级高于 and

a = 1 && b = 2 && c = 3

等价于

a = (1 and b = (2 and c = 3))

导致

    3 分配给c (2 和 3)导致 3 分配给 b (1 和 3)导致 3 最终分配给 a

【讨论】:

这真的很有帮助,谢谢大卫! 你不解释为什么2 && 3 == 3 @Borodin 逻辑 and 仅当左操作数被评估为 true 时才评估其右参数,这对除 nilfalse 之外的任何对象都有效。右操作数是表达式的结果。但我认为在回答 OP 的问题时不需要提及它。 @Borodin 您在我的答案中插入最内层的括号是非常多余的。 @DavidUnric:很公平,这是你的答案。但是我们在这里讨论的是运算符优先级,我看不出2 and c = 3 不等于(2 and c) = 3 的原因。【参考方案2】:

除了操作数的优先级之外,这种行为是逻辑运算符short-circuit evaluation的结果。

在评估and 时,如果发现第一个操作数为假,则没有理由评估第二个操作数。因此a and b 的值计算为a ? b : a

同样,or 运算符与a ? a : b 签约。

当我们不关心返回的具体值而只关心它是真还是假时,这些优化在逻辑上工作得很好。但它也允许使用有用的编码习惯,例如

( list = list || [] ) << item

之所以有效,是因为如果list 为真(非零),则list = list || [] 被评估为list = list(无操作),或者如果list 已经被评估为list = [](创建一个新的空数组)已初始化,"true"也是如此。

所以像2 and (c = 3) 这样的表达式的计算结果是2 and 32 ? 3 : 2,所以3

【讨论】:

以上是关于无法理解 ruby​​ 逻辑运算符的结果 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

ruby 布尔运算符或 ||差异[重复]

python字符串中的逻辑运算符[重复]

将逻辑运算符与 If 语句一起使用不会输出预期的结果 [重复]

带和不带括号的熊猫逻辑和运算符产生不同的结果[重复]

python中and、or和not 三个逻辑运算符,一直理解不了,求帮助!

java 逻辑运算符理解