一元运算符的运算优先级

8

一些关于操作符优先级的资料像这样说,像 !~+- 这样的一元运算符比赋值符号 =更高的优先级。然而,以下表达式也是可能的:

!a = true # => false (with warning)
a         # => true

~a = 1    # => -2
a         # => 1

+a = 1    # => 1
a         # => 1

-a = 1    # => -1
a         # => 1

考虑到这些结果,我唯一能想到的可能解释是,这些一元运算符的优先级比赋值运算符。如果是这种情况,那么就意味着我之前提到的信息是错误的。哪个是正确的?还有其他的解释吗?


2
很有趣,但这种行为完全合理,因为在赋值之前对左值应用一元运算符将不起作用。当然,文档应该解决这个问题。 - Cary Swoveland
@CarySwoveland 你是对的。 - Arup Rakshit
2
只是为了明确,~a = 1 的行为看起来像 ~(a = 1) - David Grayson
1个回答

2

我的《编程 Ruby》书籍(第二版)也将一元运算符列为比赋值运算符更高的优先级。

一元运算符确实被赋予了最高的优先级。该行被解析为 ~ (a = 1) 的原因是将该行分解为有效语法的优先级高于任何其他内容,包括使用简单变量'a'作为一元运算符操作的表达式。

如果Ruby解析器可以从该行剩余的内容中构建出有效的语法,它会使用(~ a),但没有匹配“= something”的有效规则,只有lvalue '=' rvalue。

您可以将“有效语法”视为最优先考虑的内容,然后是简单值、常量和变量名称,然后是标准运算符。


1
我认为你是正确的。实际上,我也在沿着同样的思路考虑。但是,什么时候会出现非平凡语句,即一元运算符比赋值运算符具有更高的优先级?是否有一个例子可以证明两个优先级解释都是有效的,并且这个规则会发挥作用? - sawa
1
我想不出有任何二义性的情况,既包括赋值运算符也包括任何一元运算符,因为:a. 一元运算符产生表达式,b. 一元运算符对其右侧的单个表达式进行操作,c. 表达式不能用作赋值的左侧,d. 赋值中使用的唯一表达式是右侧的单个表达式。二元运算符则不同,例如 a = 3 和 b = 4 与 a = 3 && b = 4 产生不同的结果(因为 and 的优先级低于赋值,而 && 的优先级高于赋值)。 - iheggie
我很好奇是否有人可以发明一个反例 - 我的直觉告诉我这可能是一个更容易解释为什么我认为自己是正确的,而不是意识到我错了的情况 ;) - iheggie
1
我发现了一个有用的 Ruby 解析器 gem:https://github.com/whitequark/parser - 它可以输出表达式的解析方式。 - iheggie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接