我理解后增量和预增量之间的区别,但我不明白这一点:
int b = 1;
b = b++;
System.out.println(b); // --> 1
为什么打印1?在b得到b ++的值(即1)之后,isn> b是否增加?
int x = 1;
b = x++;
System.out.println(b); // --> 1
System.out.println(x); // --> 2
这是我期望的行为。在两边使用相同的变量时有什么不同(b = b ++)?
答案 0 :(得分:2)
如果你仔细查看字节代码..你可以观察到差异..稍微改变你的代码..
public static void main(String[] args) {
int b = 1;
b = b++;
System.out.println(b); // --> 1
b=1;
b=++b;
System.out.println(b); // --> 2
}
字节代码:
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=2, args_size=1
0: iconst_1 --> int constant 1
1: istore_1 --> store 1 in slot 1 of var table i.e, for b
2: iload_1 --> load value of b from stack --> load 1
3: iinc 1, 1 --> increment value b --> store 2 for b
6: istore_1 --> store value of b "which was loaded" --> store 1 to b.. So effectively 1
7: getstatic #22 // Field java/lang/System.out:Ljava
/io/PrintStream;
10: iload_1
11: invokevirtual #28 // Method java/io/PrintStream.print
ln:(I)V
14: iconst_1
15: istore_1 --> store 1 in slot 1 of var table i.e, for b
16: iinc 1, 1 --> increment --> b=2
19: iload_1 --> load 2
20: istore_1 --> store 2.. So, effectively 2
21: getstatic #22 // Field java/lang/System.out:Ljava
/io/PrintStream;
24: iload_1
25: invokevirtual #28 // Method java/io/PrintStream.print
ln:(I)V
28: return
LineNumberTable:
line 13: 0
line 14: 2
line 15: 7
line 16: 14
line 17: 16
line 18: 21
line 25: 28
LocalVariableTable:
Start Length Slot Name Signature
0 29 0 args [Ljava/lang/String;
2 27 1 b I
答案 1 :(得分:1)
你应该从右到左阅读:
b++
将b增加为2并返回原始值的副本:1
b =
将收到右侧的值,即b ++返回的值。
答案 2 :(得分:0)
由于评估的顺序。在声明b = b++;
中,首先完全评估右侧。这意味着b
的值从1变为2,表达式的结果为1(旧值)。然后执行分配,再次将b
覆盖为1。
更明确地说,第一个例子在行为上等同于这段代码:
int b = 1;
int temp = b++; // b == 2, temp == 1
b = temp; // b == 1
System.out.println(b); // --> 1
答案 3 :(得分:0)
实际上b++
是一个后增量操作,它会增加b
变量的值,但输出不会受到影响。
换句话说,变量b
递增,但输出是b
的旧值。
我认为这个例子会给你一个更好的想法:
int b = 1;
System.out.println(++b); // --> 2
System.out.println(b++); // --> 1
System.out.println(b); // --> 2