我在java中尝试一元后缀和前缀运算符
这是代码
int a=10;
这行代码没有给出编译时错误
System.out.println(a+++ a +++a);
但是这条线确实
System.out.println(a++ +++a);
而这条线甚至没有
System.out.println(a+++ ++a);
我无法理解编译器如何解释这些查询的模式。
我在java中尝试一元后缀和前缀运算符
这是代码
int a=10;
这行代码没有给出编译时错误
System.out.println(a+++ a +++a);
但是这条线确实
System.out.println(a++ +++a);
而这条线甚至没有
System.out.println(a+++ ++a);
我无法理解编译器如何解释这些查询的模式。
System.out.println(a+++ a +++a);
被解释为相同
System.out.println(a++ + a++ + a);
它的编译和执行如下:
a
作为第一个操作数加载;第一个操作数现在是 10a
(第一个a++
),它的值现在是 11a
作为第二个操作数加载;第二个操作数现在是 11(因为它在上一步中增加了)a
(秒a++
),它的值现在是 1210 + 11
得到 21 的结果a++ + a++
,我们称之为中间结果i
,它将作为下一个 sum 的第一个操作数a
作为第二个操作数加载;第二个操作数现在是 12i
(21) 与a
(12) 相加得到33 System.out.println(a+++ ++a);
被解释为相同
System.out.println(a++ + ++a);
a
作为第一个操作数加载;第一个操作数现在是 10a
,它的值现在是 11a
,它的值现在是 12a
作为第二个操作数加载;第二个操作数现在是 12有问题的System.out.println(a++ +++a);
被解释为
System.out.println((a++)++ +a);
当您在整数文字上调用后增量时,这将给出相同的错误。
如果是
System.out.println(a++ +++a);
编译器似乎将其解释为
System.out.println((a++)++ +a);
这不起作用,因为前/后递增/递减表达式的结果是value,而不是 variable。(它也可能被视为a+ ++(++a)
但结果是一样的)。
事实上,如果你从命令行使用 Oracle 编译器编译它,你会得到以下错误:
UnaryOperatorTests.java:10: error: unexpected type
System.out.println(a++ +++a);
^
required: variable
found: value
1 error
与 Eclipse 编译器的消息相比,这更能说明正在发生的事情:
操作参数无效 ++/--
也就是说,您可以通过尝试执行以下操作从 Eclipse 中获得相同的错误:
System.out.println(1++);
因此添加一个空格:
System.out.println(a++ + ++a);
似乎消除了混淆编译器的歧义,并按照您的预期进行编译。