我正在使用Java®语言规范 Java SE 8版作为参考。
示例类:
代码
一个赋值语句由左操作数、赋值运算符和表达式组成。在这个例子中,左操作数应该是
左操作数要么是表达式名,要么是字段访问,要么是数组访问。在这个例子中,左操作数应该是一个数组访问。
问题出现在数组访问上。数组访问被定义为是一个表达式名(不适用于这个例子)或者一个PrimaryNoNewArray,然后是括号中的一个表达式。
代码`new int[] {0}`是一个ArrayCreationExpression。Primary表达式可以是ArrayCreationExpression或PrimaryNoNewArray。因此,对我来说,ArrayAccess的第二种情况应该是Primary而不是PrimaryNoNewArray。
我知道JLS并没有为所有内容都有明确的语法,例如带括号的Expressions或带括号的LeftHandSides,但这似乎是一个错误。我检查了最新的规范(Java SE 17),ArrayAccess的语法没有改变。
示例类:
class MyClass {
void method() {
new int[] {0}[0] = 1;
}
}
代码
new int[] {0}[0] = 1
应该是一个赋值语句,因为创建的数组的索引0
被赋值为1
。一个赋值语句由左操作数、赋值运算符和表达式组成。在这个例子中,左操作数应该是
new int[] {0}[0]
。左操作数要么是表达式名,要么是字段访问,要么是数组访问。在这个例子中,左操作数应该是一个数组访问。
问题出现在数组访问上。数组访问被定义为是一个表达式名(不适用于这个例子)或者一个PrimaryNoNewArray,然后是括号中的一个表达式。
代码`new int[] {0}`是一个ArrayCreationExpression。Primary表达式可以是ArrayCreationExpression或PrimaryNoNewArray。因此,对我来说,ArrayAccess的第二种情况应该是Primary而不是PrimaryNoNewArray。
我知道JLS并没有为所有内容都有明确的语法,例如带括号的Expressions或带括号的LeftHandSides,但这似乎是一个错误。我检查了最新的规范(Java SE 17),ArrayAccess的语法没有改变。
while ((new int[] {0}[0] = 1) > 0) { /* 做一些事情 */}
- Geoffnew int[] {x += 5, y -= 5, y /= x, x *= y}[3]
。显然这是一个糟糕的用法,但从技术上讲,它是一种用法。 - kaya3new int[] {0}[0] = 1
),但这肯定仍然是无用的,因为你仍然可以只使用赋值操作符右侧的表达式。你的例子基本上与while (1 > 0) { /* Do stuff */}
相同,除了可能(不可达)的内存副作用。 - xtraticjavac
允许,例如(x) = 4;
是另一个明显违反规范的行为。 - Holger