Java增量和赋值运算符

时间:2014-07-03 23:18:11

标签: java increment post-increment pre-increment

我对post ++和pre ++运算符感到困惑,例如在下面的代码中

int x = 10;
x = x++;

sysout(x);

会打印10?

它打印10,但我预计它应该打印11

但是当我做的时候

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

它会按照我的预期打印11,所以为什么x = x ++;不会改变x的值?

6 个答案:

答案 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'”。