假设我有初始化两个变量这样前增量和后增量如何工作?
int a=0;
int b=0;
,如果我现在分配b类似此
b=a++ + ++a + ++a;
现在= 3且b = 5 不应该它已经B = 2的值? 为什么b分配值5?
假设我有初始化两个变量这样前增量和后增量如何工作?
int a=0;
int b=0;
,如果我现在分配b类似此
b=a++ + ++a + ++a;
现在= 3且b = 5 不应该它已经B = 2的值? 为什么b分配值5?
让我们看看:
一个++ = 0,之后(从一个++加一preincreased所述一个)2
增加到1.
++一个= ++ a =(来自++ a的两个加上一个预增)3
总计:0 + 2 + 3 = 5
这也解释了为什么a是三。在最后一步a增加到三。
它的工作原理是这样
B = A ++ + ++一个+ ++一个
B = 0 + 2(1 + 1)+ 3(2 + 1)
B = 5.
和= 3
在其使用后增量操作者++,该变量的当前值被用作第一和然后得到递增。
但是在使用预增加运算符的++ a中,增量首先发生然后被使用。所以行为如预期。
让我最喜爱的工具检查它:javap的...
由太阳的javac的
int a = 0;
int b = 0;
b = a++ + ++a + ++a;
发出的字节代码如下所示:
a b Stack:
0: iconst_0 // push 0 0 0 0
1: istore_1 // store in a 0 0 empty
2: iconst_0 // push 0 0 0 0
3: istore_2 // store in b 0 0 empty
4: iload_1 // push value of a 0 0 0
5: iinc 1, 1 // inc a with 1 1 0 0
8: iinc 1, 1 // inc a with 1 again 2 0 0
11: iload_1 // push value of a again 2 0 0,2
12: iadd // add top two elements 2 0 2
13: iinc 1, 1 // inc a with 1 3 0 2
16: iload_1 // push a again 3 0 2,3
17: iadd // add top two elements 3 0 5
18: istore_2 // store in b 3 5 empty
我错过了使用javap,我正在尝试使用jdb,它总是在1个指令的步骤中递增,因此无法知道实际发生了什么 – GoodSp33d 2010-07-26 09:08:29
它会像B时ecaluated = 0 + 2 + 3并且在结尾b将是5并且a将是3. – jaxb 2010-07-26 07:05:23
最可能是重复的。 – ripper234 2010-07-26 07:13:12
[可以解释Java中post和pre increment操作符的工作原理](http://stackoverflow.com/questions/2371118/explain-working-of-post-and-pre-increment-operator-in-java) – 2010-07-26 07:28:56