【问题标题】:prefix and postfix operators java前缀和后缀运算符 java
【发布时间】:2014-07-26 19:34:14
【问题描述】:

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

这是代码

int a=10;

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

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

但是这条线可以

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

而这条线甚至没有

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

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

【问题讨论】:

  • 出于好奇,JDK 7 和 8 下给定的编译器错误为Invalid argument to operation ++/--
  • 我的 猜测+++a 被编译器感知为 ++,这没关系,然后又出现了另一个 +,它把事情搞砸了。如果您想调查,可以尝试++(+a)+(++a) 之类的方法。

标签: java operators postfix-operator prefix-operator


【解决方案1】:
  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,它将作为下一个和的第一个操作数
    • 加载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);

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

【讨论】:

    【解决方案2】:

    如果是

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

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

    【讨论】:

      猜你喜欢
      • 2015-07-29
      • 1970-01-01
      • 2011-03-12
      • 2011-07-21
      • 2022-11-24
      • 1970-01-01
      相关资源
      最近更新 更多