2

可能重复:
后自增运算符 java
“x = x++”之后的 x 是什么?

有人可以向我解释以下每个小程序的结果吗?:

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

结果是:10

为什么不是 11,因为 a 应该在分配后增加?这是因为它涉及到操作符的左右不同的变量 = 吗?

下一个:

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

结果是:11

可以理解,但编译器会显示警告:“对变量 a 的赋值无效”。结果不同意。

更新:

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

4

7 回答 7

11

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

  1. 取值a
  2. a递增。
  3. (1) 处的值存储到a中。

所以 的值a不会改变。

您可以自己弄清楚在第二种情况下会发生什么。

于 2012-12-05T09:12:05.400 回答
1

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

于 2012-12-05T09:12:09.410 回答
1

让我们分析每种方式产生的字节码——

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

产生的字节码 -

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 的赋值无效

产生的字节码 -

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

在这里,我们可以在第一种情况下看到变量负载首先然后递增,因此它不会对variable a.

在第二种情况下,它首先递增然后加载变量,因此它得到了递增的效果。

于 2012-12-05T09:52:52.103 回答
0

发生这种情况是因为 a++ 更像是一个方法而不是一个实际的数字。

您可以将它们分成两条单独的线。

第一个是

a = a;
return a + 1;

第二个是

a = a+1;
于 2012-12-05T09:12:17.850 回答
0

a++意味着增加 variable 的值a,但是a++具有 a! 的原始值!

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

因此,您正在做的是将 a 的值加一,然后将其设置为旧值。

++a意味着增加 variable 的值a,但是++a具有 a! 的新值!

所以在第二个例子中,你要增加 a 的值,然后将 a 的值设置为那个值(它刚刚得到),所以你做了两次同样的事情。

于 2012-12-05T09:14:52.453 回答
0

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

于 2012-12-05T09:16:37.613 回答
-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。

于 2012-12-05T09:13:09.550 回答