【问题标题】:Operator precedence of unary operators一元运算符的运算符优先级
【发布时间】:2014-03-25 06:37:27
【问题描述】:

一些关于运算符优先级like this 的信息源表明,像!~+- 这样的一元运算符的优先级高于赋值=。但是,以下表达式是可能的:

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

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

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

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

考虑到这些结果,我能想到的唯一可能的解释是这些一元运算符的优先级低于赋值。如果是这样,那就意味着我上面提到的信息是错误的。哪个是对的?有不同的解释吗?

【问题讨论】:

  • 很有趣,但这种行为非常有意义,因为在赋值之前将一元运算符应用于左值将无效。当然,文档应该解决这个问题。
  • @CarySwoveland 你是对的..
  • 为了清楚起见,~a = 1 似乎表现得像 ~(a = 1)

标签: ruby variable-assignment operator-precedence unary-operator


【解决方案1】:

我的编程红宝石书(第 2 版)还列出了一元运算符的优先级高于赋值。

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

如果 ruby​​ 解析器可以使该行的其余部分有效,它会使用 (~ a),但除了匹配 = 某物,只有 lvalue '=' rvalue 之外没有有效规则。

你可以把“有效的语法”放在首位,然后是简单值、常量和变量名,然后是标准运算符。

【讨论】:

  • 我认为你是对的。其实我也是这么想的。但是,当一元运算符具有比赋值更高的优先级时,该语句何时会变得不平凡?有没有两个优先解释都有效并且这条规则起作用的例子?
  • 我想不出赋值和任何一元运算符之间存在歧义的情况,因为 a.一元运算符产生表达式,b。一元运算符对右侧的单个表达式进行操作,c。表达式不能用作赋值和 d 的左边。赋值中使用的唯一表达式是右侧的单个表达式。二元运算符是不同的,例如 a = 3 和 b = 4 产生与 a = 3 && b = 4 不同的结果(因为 and 的优先级低于赋值,而 && 的优先级高于赋值)。
  • 我很好奇是否有人可以发明一个反例 - 我的直觉告诉我,解释为什么我认为我是对的比意识到我错了更容易;)
  • 我找到了一个有用的 ruby​​ 解析器 gem:github.com/whitequark/parser - 它会输出表达式的解析方式。
猜你喜欢
  • 2023-03-07
  • 2010-12-19
  • 2011-07-07
  • 2015-03-20
  • 1970-01-01
  • 2021-10-25
  • 2021-03-05
相关资源
最近更新 更多