前缀和后缀运算符java

时间:2014-07-26 19:34:15

标签: java operators postfix-operator prefix-operator

我在java中尝试了一元postfix和前缀运算符

这是代码

int a=10;

这行代码不会产生编译时错误

System.out.println(a+++ a +++a);   

但是这行

System.out.println(a++ +++a);

而这条线甚至没有

System.out.println(a+++ ++a);

我无法理解编译器如何解释这些查询的模式。

2 个答案:

答案 0 :(得分:2)

  1. 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
  2. System.out.println(a+++ ++a);

    的解释与

    相同

    System.out.println(a++ + ++a);

    • 加载a作为第一个操作数; 第一个操作数现在为10
    • 后增量a,其值现在为11
    • 预增量a,其值现在为12
    • 加载a作为第二个操作数; 第二个操作数现在为12
    • 添加两个以获得 22
  3. 有问题的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);

似乎消除了混淆编译器的歧义,并按照您的预期进行编译。