增量运算符++

时间:2012-12-05 09:07:55

标签: java increment assignment-operator

  

可能重复:
  post increment operator java
  What is x after “x = x++”?

有人能解释一下以下每个小程序的结果吗? :

public static void main(String[] args) {
    int a = 10;
    a = a++;
    System.out.println(a);
}

结果是:10

为什么不是11因为a应该在作业后增加?这是因为它涉及到opeartor左右不同的变量=?

下一个:

public static void main(String[] args) {
    int a = 10;
    a = ++a;
    System.out.println(a);
}

结果是:11

易于理解,但编译器会出现警告:“对变量a的赋值无效”。但结果却不同意。

更新

我不会修改我原来的问题,但我添加了这条评论以澄清现在我抓住了警告的含义。也就是说,即使没有赋值(通过简单的语句++ a),结果也是相同的(11)。

7 个答案:

答案 0 :(得分:11)

a++的值为a++的优先级高于=。所以:

  1. a的值。
  2. a会增加。
  3. 第(1)项的值存储在a
  4. 因此a的值不会改变。

    你可以弄清楚第二种情况会发生什么。

答案 1 :(得分:1)

在第一种情况下,首先发生分配,然后增加。所以你获得了增量之前的价值。但在第二种情况下,它先增加,然后分配。

答案 2 :(得分:1)

让我们分析以各种方式产生的字节代码 -

int a = 10;
a = a++;
System.out.println(a); //Output - 10 

制作了ByteCode -

0 bipush
2 istore_1
3 iload_1 
4 iinc      
7 istore_1
8 getstatic
11 iload_1
12 invokevirtual
15 return

int a = 10;
a = ++a;
System.out.println(a); //Output -11

此处编译器发出警告 - 对变量a的赋值无效

制作ByteCode -

0 bipush
2 istore_1
3 iinc
6 iload_1
7 istore_1
8 getstatic
11 iload_1
12 invokevirtual
15 return

在这里我们可以看到第一种情况下变量首先加载然后递增,因此它不会对variable a产生任何影响。

在第二种情况下,它首先递增,然后加载变量,使其达到增量效果。

答案 3 :(得分:0)

这是因为++更像是一个方法,而不是一个真实的数字。

你可以将它们分成两个单独的行。

第一个是

a = a;
return a + 1;

第二个是

a = a+1;

答案 4 :(得分:0)

a++表示增加变量a的值,但a++具有原始值!

a = ??表示将a的值设置为??

所以你正在做的是将a的值递增1,然后将其设置为旧值。

++a表示增加变量a的值,但是++a具有新的值!

所以在第二个例子中,你是递增a的值,然后将a的值设置为该值(它刚刚得到),所以你做两次相同的操作。

答案 5 :(得分:0)

a++等同于a = a + 1,但在表达式中使用该值后增加(此处赋值)++a相同但在表达式中使用之前递增。 a = ++a;没有明确的分配影响,因为它等于a = a = a + 1

答案 6 :(得分:-2)

当您编写a++时,意味着在处理'='运算符后将增加。所以

b = a++;
System.out.println(a);
System.out.println(b);

应该在你的屏幕上产生:11,10。因为a在b取'a'的值后变为11。如果您将a++更改为++a,则会在处理'='之前强制执行增量,因此您将给出b = a + 1,并且在屏幕上您应该有11,11。