Ruby中And/&&的运算符优先级[重复]

Posted

技术标签:

【中文标题】Ruby中And/&&的运算符优先级[重复]【英文标题】:Operator precedence for And/&& in Ruby [duplicate] 【发布时间】:2010-12-22 20:48:17 【问题描述】:

我对 Ruby 中的 and/&&/= 关键字有疑问。

ruby 文档说上述关键字的优先级是:(1)&&、(2)=、(3)and。

我有这个我写的sn-p代码:

def f(n) 
 n
end

if a = f(2) and  b = f(4) then  
    puts "1) #a #b" 
 end

if a = f(2) &&  b = f(4) then   
    puts "2) #a #b"     
end

输出是:

1) 2 4 [预期]

2) 4 4 [为什么?]

由于某种原因,使用 && 会导致 a 和 b 都为 4?

【问题讨论】:

【参考方案1】:

我不太明白你问的问题。我的意思是,您已经自己给出了答案,甚至问这个问题之前:&&= 更紧密,而and 比@987654324 更紧密@。

因此,在第一种情况下,表达式的计算方式如下:

( a=f(2) )  and  ( b=f(4) )
( a=  2  )  and  ( b=f(4) )
      2     and  ( b=f(4) ) # a=2
      2     and  ( b=  4  ) # a=2
      2     and        4    # a=2; b=4
                       4    # a=2; b=4

第二种情况,评价如下:

a   =   (  f(2) && ( b=f(4) )  )
a   =   (    2  && ( b=f(4) )  )
a   =   (    2  && ( b=  4  )  )
a   =   (    2  &&       4     ) # b=4
a   =                    4       # b=4
                         4       # b=4; a=4

【讨论】:

【参考方案2】:

原因很简单:优先。正如你所说,顺序是:

    && = 和

由于&& 优先于=,因此该语句的计算方式如下:

if a = (f(2) && (b = f(4))) then 

结果:

if a = (2 && 4) then

xy 是整数时,x && y 返回y。因此2 && 4 产生a = 4

为了比较,第一个是这样计算的:

if (a = f(2)) and  (b = f(4)) then 

【讨论】:

我在你的例子中不明白为什么它不会被评估为:if a = ( f(2) && b ) = f(4) then【参考方案3】:

来自Programming Ruby 1.9:

这两种形式的唯一区别是优先级(and 绑定低于&&)。

【讨论】:

【参考方案4】:

我不知道在这种情况下可以提供帮助的具体规则,但让我们使用操作的优先级。 使用优先级规则,我们可以将第二个表达式的计算分为几个步骤

1 f(2) &&  b => expr1
2 expr1 = f(4) => expr2
3 a = expr2

显然,在第 2 步中我们得到了一个不正确的情况 - = 的左侧是右值 - 临时对象,它不能被任何值分配。我假设句法分析器在遇到这种情况时会破坏表达式的优先级评估规则。 更多关于表达式计算的细节可以查看here

【讨论】:

【参考方案5】:

如果你像这样修改你的代码,你会得到你所期望的

def f(n) 
  n
end

if (a = f(2) and  b = f(4)) then  
  puts "1) #a #b" 
end

if (a = f(2)  and  b = f(4)) then   
  puts "2) #a #b"         
end

1) 2 4

2) 2 4

【讨论】:

以上是关于Ruby中And/&&的运算符优先级[重复]的主要内容,如果未能解决你的问题,请参考以下文章

JS中&&和||的理解

Java 运算符优先级

C# 条件 AND (&&) OR (||) 优先级

ruby 中“&:”运算符的功能是啥? [复制]

运算符优先级

在ruby && =运算符是片状?