我对post ++和pre ++运算符感到困惑,例如在下面的代码中
int x = 10;
x = x++;
sysout(x);
会打印10?
它打印10,但我预计它应该打印11
但是当我做的时候
x = ++x; instead of x = x++;
它会按照我的预期打印11,所以为什么x = x ++;不会改变x的值?
答案 0 :(得分:15)
不,10的打印输出是正确的。理解结果背后原因的关键是预增量++x
和后增量x++
复合赋值之间的差异。使用预增量时,表达式的值在执行增量后获取。但是,当您使用后增量时,表达式的值在递增之前取,并在将递增结果写回变量之后存储供以后使用。
以下是导致您所看到的事件序列:
x
被分配了10
++
位于后递增位置,因此x
的当前值(即10
)会被存储以供日后使用11
的新值存储在x
10
的临时值会重新存储回x
,并写在11
上已存储的位置。答案 1 :(得分:3)
后增量(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
}
}
答案 2 :(得分:1)
引自The Java tutorials - Assignment, Arithmetic, and Unary Operators:
可以在操作数之前(前缀)或之后(后缀)应用递增/递减运算符。代码
result++;
和++result;
都将以结果递增1结束。唯一的区别是前缀版本(++result
)评估为增量值,而后缀版本(result++
)评估为原始值。如果您只是执行简单的增量/减量,那么选择哪个版本并不重要。但是,如果您在较大的表达式中使用此运算符,则您选择的运算符可能会产生显着差异。
答案 3 :(得分:1)
在准备Java认证考试时,我也被后增量运算符的棘手问题迷住了。大多数人,甚至是经验丰富的人,都认为在执行 语句 之后,变量后递增(++)会递增变量,就像上面的@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
根据通常的假设,在完成对print
方法的调用之后,静态变量x将增加。但是当在方法内部检查时,它已经增加了。因此,递增,递减后的运算符将变量值提交给作为参数的方法或运算符,并在执行运算符/方法之前立即递增/递减相关变量。预增/减操作的混乱程度有所降低,但是即使是按方法或运算符,也不会发生整个语句,这种情况再次发生。
// 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.
答案 4 :(得分: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.
这是基于后缀和前缀运算符的定义。
答案 5 :(得分:-1)
执行此操作时:
x = x++;
它实际上被翻译为“将'x'分配给'x',然后将'x'增加1”。
在这种情况下:
x = ++x;
它被转换为“递增'x'加1,然后将其分配给'x'”。