我问这个是因为我只看到对后缀和一元表达式的求值从左到右开始。
int i = 0;
System.out.println(--i + i++); // -1 + -1 = -2 vs. // 0 + 0 = 0
这很清楚,但是在什么时候以及什么情况下,this java优先规则适用于后缀和一元运算符。第二个问题是为什么java docs表中没有一元后缀?
一元++ expr --expr + expr -expr〜!编辑:
我进行了更多搜索,并在The Java Language Specification上找到了完整的答案strange table in the Oracle Tutorial让我与OCA考试准备混在一起。
多个增量/减量操作不能一起进行。因此,在这种情况下优先级无关紧要。
例如:
x+++++x
这会给您一个编译器错误。为什么?因为对于编译器,它是:
(x++)++ + x
从docs:
后缀表达式的结果必须是以下类型的变量: 可转换(第5.1.8节)为数字类型或编译时错误 发生。一元表达式的结果必须是以下类型的变量: 可转换(第5.1.8节)为数字类型或编译时错误 发生。
在第一个
x++
之后,它不再是变量,因此第二个操作不在变量上发生,而是不允许的值。但是,您可以添加括号使其正常工作,但是与以前不同。这样的例子之一是:
(x++) + (++x)
但是这些是2个不同的操作,因此优先级是不相关的。