增加变量

时间:2014-11-26 11:20:26

标签: java increment

我理解后增量和预增量之间的区别,但我不明白这一点:

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 ++)?

4 个答案:

答案 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