我感到困惑的帖子++和预++运算符,例如在下面的代码Java的增量和赋值运算符
int x = 10;
x = x++;
sysout(x);
将打印10?
它打印10,但我希望它应该打印11
但是当我做
x = ++x; instead of x = x++;
将打印11种我所料,那么,为什么X = X ++;不会改变x的值?
我感到困惑的帖子++和预++运算符,例如在下面的代码Java的增量和赋值运算符
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
++
(即10
)存储的x
当前值供以后使用11
存储在x
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.
这是基于postfix和prefix运算符的定义。
当你这样做:
x = x++;
实际上,它被翻译成“分配‘X’到‘X’,然后递增一‘X’”。
而在这种情况下:
x = ++x;
它被翻译为 “增量 'X' 一个,然后将其分配给 'X'”。
看来是这样,取消优先谈话。 – TheStack
从The Java tutorials - Assignment, Arithmetic, and Unary Operators引用:
递增/递减运营商可以前(前缀)被施加或之后(后缀)的操作数。代码
result++;
和++result;
的结果都会以1递增。唯一的区别是前缀版本(++result
)评估为递增值,而后缀版本(result++
)评估为原始值。如果您只是执行简单的递增/递减操作,则选择哪个版本无关紧要。但是如果你在更大的表达式中使用这个运算符,那么你选择的运算符可能会有很大的不同。
后增量(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
}
}
因为这样的困惑,你真的不应该在真正的代码做到这一点。 –
而不是'x = x ++'==>'x ++' – donfuxx
投票重新开放:重复问题是关于前后增量之间的特定差异。尽管理解这种差异有助于回答这个问题,但它并不完全相同。 – dasblinkenlight