箭头(->)运算符的优先级/优先级最低,还是分配/组合分配的优先级最低?


18

JLS

最低优先级操作者是lambda表达式的箭头( - >) 接着由赋值运算符。

遵循哪个方向(增加优先级,减少优先级)?-“跟随”是指分配的优先级较高还是较低(相对于箭头运算符)?我猜想,这是因为“最低”(箭头)表示绝对最低。

据我了解,箭头(->)应该在此普林斯顿的最底部运算符优先级表的(位于所有赋值运算符的下方),因此箭头(->)的优先级为0(零)(根据该表)。

我的理解正确吗?

考试托盘似乎说箭头优先级至少与分配相同。此外,还阐明了箭头的关联性是Left-> To-> Right(与分配不同)。我没有找到JLS的箭头关联性报价。

我一直认为分配优先级原则上最低。


5
The lowest precedence operator is the arrow of a lambda expression.
卡亚曼

2
是的,您的理解是正确的。
伊兰(Eran)

4
如果->是低EST,赋值运算符不能有低优先。
安迪·特纳

IntFunction fo = a->b->a-b; // in test 通常表示->的优先级/关联性。因此,我决定在整个优先级/关联性表中澄清->优先级/关联性,因为对此不确定。
代码完成

1
@glglgl您的例子IntUnaryOperator op; op = x -> x;很有趣。也许(op = x) -> x因为op = x不是有效的LambdaParameters生产实例而不被考虑?
安迪·特纳

Answers:


13

请注意引用的JLS文本前面的句子:

运算符之间的优先级由语法产生的层次结构管理。

Java语言的语法确定了可能的构造,并且隐式地确定了运算符的优先级。

甚至您已链接的princeton表也指出:

Java语言规范中没有明确的运算符优先级表。网络上和教科书中的不同表格在某些较小的方面存在分歧。

因此,Java语言的语法不允许在赋值运算符的左侧使用lambda表达式,同样,也不允许在->。运算符的左侧进行赋值。因此,尽管这些操作符之间没有歧义,但优先规则(尽管在JLS中已明确指出)变得毫无意义。

这样可以毫无歧义地编译例如这样的gem:

static Consumer<String> C;
static String S;
public static void main(String[] args)
{
  Runnable r;
  r = () -> C = s -> S = s;
}

10

首先,让我们在这里解释实际问题。

假设你有一个像

IntUnaryOperator op;

语法上接受了以下内容,并且可以正常工作:

op = x -> x;

也就是说,我们在int分配给op变量时具有一个恒等函数。但是如果=优先级更高,我们希望Java将其解释为

(op = x) -> x;

在语法上无效,因此应该是编译错误。因此,实际上分配并不比箭头具有更高的优先级。

但是以下内容也可以(假设t是type的类/实例变量int):

op = x -> t = x;

这将进行编译,并且该函数(如果应用)将操作数的值分配给该值,t并返回该值。

这意味着箭头的优先级没有比赋值高t = x。否则它将被解释为

op = ( x -> t ) = x

显然,这不会发生。

因此,似乎操作具有相同的优先级。而且,它们是右关联的。从JLS第19章的语法中可以看出

Expression:
  LambdaExpression
  AssignmentExpression

LambdaExpression:
  LambdaParameters -> LambdaBody

...

LambdaBody:
  Expression
  Block

因此,lambda主体的右侧使我们回到Expression,这意味着我们可以在其中具有(较高优先级)lambda,也可以在其中具有(较高优先级)赋值。我的意思是“更高的优先级”是,您越深入生产规则,表达式就越早被评估。

赋值运算符也是如此:

AssignmentExpression:
  ConditionalExpression
  Assignment

Assignment:
  LeftHandSide AssignmentOperator Expression

再一次,作业的右侧将我们带回到 Expression,因此我们可以在其中拥有一个lambda表达式或赋值。

因此,文法不是依靠JLS文本,而是为情况提供了清晰定义的描述。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.