【问题标题】:Forcing order precedence (right associative)强制顺序优先(右结合)
【发布时间】:2019-11-12 01:12:01
【问题描述】:

强制左关联操作的顺序优先非常容易: 10 - 5 + 310 - (5 + 3)

但是,我想知道是否有办法通过右关联运算符强制这样的优先级?我很难弄清楚。 例如,如果我在 Java 中工作,我可以强制使用 ++= 运算符之类的优先级吗?

【问题讨论】:

  • 不,我不相信在 Java 中重载运算符的优先级是可能的。使用你已经知道的括号。
  • @TimBiegeleisen 所以,假设我正在使用 Java 中的“~-3”操作。你是说不能强制优先吗?
  • 这就是我要说的 :-) ... 如果您想更改默认行为,请使用括号。
  • 看起来很有趣,但我不确定你想做什么。你能提供一个表达的例子和期望的结果吗?也许编辑您的问题以提供更多详细信息。
  • @WJS 我只是好奇是否可以使用括号强制右关联运算符的顺序。我认为使用左关联运算符很容易做到这一点。假设我有类似的东西:“x = y = z”。最后,x 将等于 z 的任何值。是否有可能做类似“(x = y)= z”的事情来改变它的评估方式?如果这有任何意义。

标签: java operator-precedence


【解决方案1】:

通常,更改右关联运算符的计算顺序与更改左关联运算符的方式相同。

当您拥有a × b × c 形式的表达式时,您可以通过指定(a × b) × ca × (b × c) 来确定评估顺序,无论哪个是默认值。 JLS, §15.7.3 声明:

Java 编程语言遵循括号明确指示的求值顺序和运算符优先级隐含的求值顺序。

但是,赋值的结果是一个值,赋值运算符的左边是不允许有值的,所以(a = b) = c总是无效的。这与 C++ 等编程语言不同,其中表达式¹ 可以评估为可分配的引用。

正如this answer 中所解释的,优先级由 Java 编程语言的语法隐含地给出。由于赋值运算符的语法已经以不允许运算符左侧的任意表达式的方式定义,特别是这里不支持大括号表达式,因此尝试分配给大括号赋值已经得到被解析器拒绝²。

请注意,同样,a -> b -> c 是右关联的,但不能更改,因为 (a -> b) -> c 不是有效表达式,因为 -> 左侧唯一有效的东西是参数列表。

Java 中唯一的右关联表达式,改变顺序是有意义的,是三级运算符,因为a? b: c? d: e 被评估为a? b: (c? d: e),但可以更改为(a? b: c)? d: e,如果bc 计算结果为 boolean

对于一元运算符的组合,您不能通过插入括号来更改计算顺序。如果您有op1 op2 value 形式的表达式,但想要op2 op1 value,则只需使用后者。另一件事是,例如- a - b,其中(- a) - b- (a - b)的含义不同,但这是涉及二元运算符的另一种情况。

¹ 以变量名或数组索引结尾的除外
² 至少,应该。我刚刚注意到 ecj 和 javac 都与规范相矛盾,并且仅在解析后才拒绝它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多