Java增量和赋值运算符

Java增量和赋值运算符,java,increment,post-increment,pre-increment,Java,Increment,Post Increment,Pre Increment,我对post++和pre++操作符感到困惑,例如在下面的代码中 int x = 10; x = x++; sysout(x); 能打印10张吗 它打印10张,但我想它应该打印11张 但当我这么做的时候 x = ++x; instead of x = x++; 它将像我预期的那样打印11个,那么为什么x=x++;不改变x的值吗?不,10的打印输出是正确的。理解结果背后原因的关键是增量前++x和增量后x++复合赋值之间的差异。使用预增量时,将在执行增量后获取表达式的值。但是,当使用增量后处理时

我对post++和pre++操作符感到困惑,例如在下面的代码中

int x = 10;
x = x++;

sysout(x);
能打印10张吗

它打印10张,但我想它应该打印11张

但当我这么做的时候

x = ++x; instead of x = x++;

它将像我预期的那样打印11个,那么为什么x=x++;不改变x的值吗?

不,10的打印输出是正确的。理解结果背后原因的关键是增量前
++x
和增量后
x++
复合赋值之间的差异。使用预增量时,将在执行增量后获取表达式的值。但是,当使用增量后处理时,表达式的值在增量之前获取,并在增量结果写回变量后存储以供以后使用

以下是导致您看到的事件的顺序:

  • x
    已分配
    10
  • 由于
    ++
    处于增量后位置,因此
    x
    的当前值(即
    10
    )被存储以供以后使用
  • 11的新值存储到
    x
  • 10
    的临时值存储回
    x
    ,直接写入存储在那里的
    11

我在JLS中没有找到一个引用,因此这个答案是基于这样的推测,即您不是调用未定义的行为,因为这是Java

x = x++; // Assign the old value of `x` to x, before increment.
x = ++x; // Assign the new value of `x` to x, after increment.
这是基于后缀和前缀运算符定义的。执行此操作时:

x = x++;
它实际上被转换为“将‘x’分配给‘x’,然后将‘x’增加一”

鉴于在这种情况下:

x = ++x;
它被转换为“增量“x”,然后分配给“x”。

引用自:

递增/递减运算符可以应用于操作数之前(前缀)或之后(后缀)。代码
result++
++结果将以结果递增1结束。唯一的区别是前缀版本(
++result
)的计算结果为递增值,而后缀版本(
result++
)的计算结果为原始值。如果您只是执行一个简单的递增/递减操作,那么选择哪个版本并不重要。但是,如果在较大表达式的一部分中使用此运算符,则选择的运算符可能会产生显著的差异

增量后(n++):首先执行语句,然后将值增加1

预增量(++n):首先将值增加1,然后执行语句

例如:

class IncrementTest{
    public static void main(String[] args){

        System.out.println("***Post increment test***");
        int n = 10;
        System.out.println(n);      // output  10
        System.out.println(n++);    // output  10
        System.out.println(n);      // output  11

        System.out.println("***Pre increment test***");
        int m = 10;
        System.out.println(m);      // output  10
        System.out.println(++m);    // output  11
        System.out.println(m);      // output  11
    }
}

在准备Java认证考试时,我还被后增量操作符的诡计绊倒了。大多数情况下,即使是经验丰富的think post increment(++)运算符,也会在执行语句后对变量进行递增,正如上面@bartektartanus所述。这种思想对于大多数真实世界的编码来说已经足够好了,但是如果一个后/预递增/递减变量在一个语句中出现不止一次,它就会崩溃。看起来,所谓的面试/知识测试问题会迅速检查这个松散的假设。这是值得打破的。上述公认的答案对于简洁、合乎逻辑的记忆法没有多大帮助

public class Test {
    static int x = 10;

    public static void main(String[] args) {
        print(x++);
    }

    private static void print(int x) {
        System.out.println(x);
        System.out.println(Test.x);
    }
}

Output
10
11
根据常见的假设,静态变量x将在调用
print
方法完成后递增。但是当在方法内部检查时,它已经被递增了。因此,增量后、减量运算符将变量值提交给作为参数的方法或运算符,并在运算符/方法执行之前立即递增/减量相关变量。预递增/递减操作稍微不那么容易混淆,但同样地,即使是每个方法或运算符都会发生这种情况,而不是整个语句

// The OP
int x = 10;
x = x++; // x = 10. x does get incremented but before the assignment operation

int x = 10;
x = x++ + x; // x = 21. x got incremented immediately after the addition operator grabbed its value.

由于这种混乱,你真的不应该在实际代码中这样做。与其投票重新打开,不如投票重新打开:重复的问题是关于增量前后的具体区别。虽然理解这种差异将有助于回答这个问题,但这并不是完全的重复。看来情况确实如此。