5

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

这是代码

int a=10;

这行代码没有给出编译时错误

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

但是这条线确实

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

而这条线甚至没有

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

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

4

2 回答 2

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,它将作为下一个 sum 的第一个操作数
    • a作为第二个操作数加载;第二个操作数现在是 12
    • i(21) 与a(12) 相加得到33
  2. System.out.println(a+++ ++a);

    被解释为相同

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

    • a作为第一个操作数加载;第一个操作数现在是 10
    • post-increment a,它的值现在是 11
    • pre-increment a,它的值现在是 12
    • a作为第二个操作数加载;第二个操作数现在是 12
    • 将两者相加得到22
  3. 有问题的System.out.println(a++ +++a);

    被解释为

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

    当您在整数文字上调用后增量时,这将给出相同的错误。

于 2014-07-26T20:00:42.017 回答
1

如果是

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);

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

于 2014-07-26T19:55:56.297 回答