2010-07-26 64 views
2

假设我有初始化两个变量这样前增量和后增量如何工作?

int a=0; 
int b=0; 

,如果我现在分配b类似此

b=a++ + ++a + ++a; 

现在= 3且b = 5 不应该它已经B = 2的值? 为什么b分配值5?

+0

它会像B时ecaluated = 0 + 2 + 3并且在结尾b将是5并且a将是3. – jaxb 2010-07-26 07:05:23

+0

最可能是重复的。 – ripper234 2010-07-26 07:13:12

+0

[可以解释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

回答

0

让我们看看:

  • 一个++ = 0,之后(从一个++加一preincreased所述一个)2

  • 增加到1.

  • ++一个= ++ a =(来自++ a的两个加上一个预增)3

总计:0 + 2 + 3 = 5

这也解释了为什么a是三。在最后一步a增加到三。

0

它的工作原理是这样

B = A ++ + ++一个+ ++一个

B = 0 + 2(1 + 1)+ 3(2 + 1)

B = 5.

和= 3

在其使用后增量操作者++,该变量的当前值被用作第一和然后得到递增。

但是在使用预增加运算符的++ a中,增量首先发生然后被使用。所以行为如预期。

0

让我最喜爱的工具检查它: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 
+0

我错过了使用javap,我正在尝试使用jdb,它总是在1个指令的步骤中递增,因此无法知道实际发生了什么 – GoodSp33d 2010-07-26 09:08:29