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’”。