java - 箭头(->)运算符优先级/优先级最低,或者赋值/组合赋值的优先级最低?

标签 java java-8 language-lawyer operator-precedence specifications

JLS :

The lowest precedence operator is the arrow of a lambda expression (->), followed by the assignment operators.

遵循哪个方向(增加优先级、降低优先级)? - “followed”意味着赋值具有更高的优先级或更低的优先级(相对于箭头运算符)?我想,是在增加,因为“最低”(箭头)意味着绝对最低。

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

我的理解正确吗?

ExamTray似乎是说箭头优先级至少与赋值相同...另外还澄清了箭头关联性是 Left->To->Right (与赋值不同)。我没有找到任何有关箭头关联性的 JLS 引用。

我过去一直认为分配优先级基本上是最低的,这是有原因的。

最佳答案

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

Precedence among operators is managed by a hierarchy of grammar productions.

Java 语言的语法决定了哪些构造是可能的,并且隐含地决定了运算符的优先级。

甚至是princeton table您已链接状态:

There is no explicit operator precedence table in the Java Language Specification. Different tables on the web and in textbooks disagree in some minor ways.

因此,Java 语言的语法不允许在赋值运算符左侧使用 lambda 表达式,同样,也不允许在 -> 左侧进行赋值。因此,这些运算符之间可能不存在任何歧义,并且优先级规则虽然在 JLS 中明确说明,但变得毫无意义。

这允许编译,例如这样的 gem ,毫无歧义:

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

关于java - 箭头(->)运算符优先级/优先级最低,或者赋值/组合赋值的优先级最低?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59068702/

相关文章:

java - 如何在启动时向我的 java 应用程序(如 .exe)传递文档的路径?

c++ - 奇怪的 constexpr typeid 错误

c++ - 静态对象的析构函数中未捕获的异常

Java静态函数

java - Swing 和最终修饰符

Java 转换字符串 yyyy-MM-dd HH :mm:ss to timestamp of Canada/Eastern timezone

java - Map Stream 获取 Key 和 Value 乘积的总和

java - 使用 Java 流简化列表,其中每个元素本身都是映射列表

java - 如何在可完成的 future 测试异常?

c++ - 使用转换为 "wrong"类型的指针算法