Java增量和赋值运算符

我对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

Post Increment(n ++) :首先执行语句然后将值增加1。

Pre Increment(++ 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教程 – 赋值,算术和一元运算符 :

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

在准备Java认证考试时,我也偶然发现了增量后操作员的棘手问题。 大多数,即使是有经验的,认为后增量(++)运算符在执行语句后递增变量,就像上面所述的@bartektartanus一样。 这种思想对于大多数现实世界的编码来说已经足够好了,但是如果在语句中多次出现一个post / pre-incrementmented / decremented变量,那么就会出现故障。 看起来所谓的面试/知识测试问题会立即检查这个松散的假设。 值得打破这一点。 上面接受的答案对于简洁,合乎逻辑的助记符并没有那么有用。

 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. 

我没有在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’增加1”。

在这种情况下:

 x = ++x; 

它被转换为“递增’x’一个,然后将其分配给’x’”。