我在java中尝试了一元postfix和前缀运算符
这是代码
int a=10;
这行代码不会产生编译时错误
System.out.println(a+++ a +++a);
但是这行
System.out.println(a++ +++a);
而这条线甚至没有
System.out.println(a+++ ++a);
我无法理解编译器如何解释这些查询的模式。
答案 0 :(得分:2)
System.out.println(a+++ a +++a);
的解释与
相同 System.out.println(a++ + a++ + a);
它的编译和执行如下:
a
作为第一个操作数; 第一个操作数现在为10 a
(第一个a++
),其值现在为11 a
作为第二个操作数; 第二个操作数现在为11 (因为它在上一步中递增)a
(第二个a++
),其值现在为12 10 + 11
得到21,这是a++ + a++
的结果,让我们调用这个中间结果i
,它将作为下一个和的第一个操作数< / LI>
a
作为第二个操作数; 第二个操作数现在为12 i
(21)添加到a
(12)以获得 33 System.out.println(a+++ ++a);
的解释与
相同 System.out.println(a++ + ++a);
a
作为第一个操作数; 第一个操作数现在为10 a
,其值现在为11 a
,其值现在为12 a
作为第二个操作数; 第二个操作数现在为12 有问题的System.out.println(a++ +++a);
被解释为
System.out.println((a++)++ +a);
当你在整数文字上调用post-increment时会产生同样的错误。
答案 1 :(得分:1)
在
的情况下System.out.println(a++ +++a);
编译器似乎将其解释为
System.out.println((a++)++ +a);
这不起作用,因为前/后递增/递减表达式的结果是值,而不是变量。 (也可能将其视为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);
似乎消除了混淆编译器的歧义,并按照您的预期进行编译。