2014-07-03 82 views
8

我感到困惑的帖子++和预++运算符,例如在下面的代码Java的增量和赋值运算符

int x = 10; 
x = x++; 

sysout(x); 

将打印10?

它打印10,但我希望它应该打印11

但是当我做

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

将打印11种我所料,那么,为什么X = X ++;不会改变x的值?

+3

因为这样的困惑,你真的不应该在真正的代码做到这一点。 –

+3

而不是'x = x ++'==>'x ++' – donfuxx

+0

投票重新开放:重复问题是关于前后增量之间的特定差异。尽管理解这种差异有助于回答这个问题,但它并不完全相同。 – dasblinkenlight

回答

8

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

这里是事件发生的顺序,导致你所看到的:

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

我还没有发现在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. 

这是基于postfix和prefix运算符的定义。

-1

当你这样做:

x = x++; 

实际上,它被翻译成“分配‘X’到‘X’,然后递增一‘X’”。

而在这种情况下:

x = ++x; 

它被翻译为 “增量 'X' 一个,然后将其分配给 'X'”。

+0

看来是这样,取消优先谈话。 – TheStack

0

The Java tutorials - Assignment, Arithmetic, and Unary Operators引用:

递增/递减运营商可以前(前缀)被施加或之后(后缀)的操作数。代码result++;++result;的结果都会以1递增。唯一的区别是前缀版本(++result)评估为递增值,而后缀版本(result++)评估为原始值。如果您只是执行简单的递增/递减操作,则选择哪个版本无关紧要。但是如果你在更大的表达式中使用这个运算符,那么你选择的运算符可能会有很大的不同。

1

后增量(N ++):首先执行该语句然后逐一增加的值。

预增量(++ 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 
    } 
}