有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

前缀和后缀操作符java

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

这是密码

int a=10;

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

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

但这条线确实如此

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

而这条线甚至没有

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

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


共 (2) 个答案

  1. # 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);

      当调用整数文本的post增量时,会出现相同的错误

  2. # 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编译器的消息相比,这更能说明发生了什么:

    Invalid argument to operation ++/

    也就是说,您可以通过尝试执行以下操作,从Eclipse中获得相同的错误:

    System.out.println(1++);
    

    添加一个空格:

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

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