我在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);
似乎消除了混淆编译器的歧义,并按照您的预期进行编译。