7

所以我正在测试运算符,因为我在帮助我的朋友使用 java 并且我偶然发现了一个奇怪的编程顺序。当我运行以下代码时发生了什么

public static void main(String[] args) {
    int B = 6;
    //First console print out
    System.out.println(B+=++B);
    System.out.println(B);
    B = 6;
    //Second Console print out
    System.out.println(B+=B++);
    System.out.println(B);
}

以下代码的输出是

13
13

12   
12

是什么导致第二个控制台 B 数学输出 = 12,当它将 6 添加到自身时,然后是 ++(即 +1)

4

8 回答 8

8

这里的区别在于增量运算符。

在 的情况下B += ++B,B 递增到 7 并添加到其旧自身 (6) 以达到 13。

在 的情况下B += B++,将 B 添加到自身,得到 12,然后执行 ++ 并将结果存储在 B 中,但计算结果随后存储在 B 中的 ++ 上。因此给出 12 作为输出。

于 2013-09-09T22:23:37.600 回答
5
ACTION       EFFECT   NOTES
----------   ------   -----
B = 6        B = 6
B += (++B)   B += 7   // B is incremented and the value is returned
B            B = 13

B = 6        B = 6
B += (B++)   B += 6   // The current value of B is the result of (B++) and B is
                      // incremented *after* the (B++) expression; however, the
                      // assignment to B (+=) happens after the (++) but it does
                      // not re-read B and thereby covers up the post increment.
B            B = 12
于 2013-09-09T22:26:59.497 回答
2

它给自己加 6,然后是 ++

情况并非如此。它将B++(即B++计算结果的值)的结果添加到B. B++计算结果为 6,因为后缀增量运算符的计算结果为增量之前的操作数的值。所以它增加了 6 到B.

您认为增量应该在分配之后发生,但这不是 ++ 的工作方式。增量立即发生,但表达式计算为B增量之前的值。因此,由于您BB++评估后立即重新分配,因此分配取消了增量。

于 2013-09-09T22:26:20.683 回答
2

当涉及到预增量和后增量运算符时,请始终记住它们是在读取相关变量之前/之后立即应用的,并且在处理左侧或赋值之前。

例如

int a = 2;
a = a++ + a++ + a++;

a将是 9,因为它最终是a = 2 + 3 + 4;

同样地

int a = 2;
a = a++;

a 仍然是2,因为赋值发生在增量之后,而增量发生在 read 之后

int a = 2;
a = ++a;

a将是 3,因为赋值发生在增量之后,但增量发生在 read 之前

在您的第二个示例中,后增量发生在读取之后,因此在B分配发生之前,增量永远没有机会被读取(不在表达式中再次使用)(一个覆盖B和任何影响后增量的分配将有有)。

如果你这样做:

int B = 6;
int C = B + B++;

然后你最终将B等于 7,而C将等于 12。而B++ + BorB + ++B最终将C等于 13,B仍然等于 7。

于 2013-09-09T23:07:33.613 回答
0

++B 表示:增加值,然后返回它。B++ 表示:返回值然后递增。

于 2013-09-09T23:01:06.590 回答
0

重写和替换:B = 6 + 6之后B++执行,因为B++从B中取当前值然后递增,所以当B++发生时,没关系,B值将是12

于 2013-09-09T22:25:52.657 回答
0

当您将递增运算符放在变量前面时,它会递增然后显示变量。当您将增量运算符放在变量之后时,它会显示该变量,然后将其加 1。

于 2013-09-09T22:26:04.610 回答
0

b+=x是一样的b = b + x

你正在这样做b+=b++,它可以写成b = b + b++which for b=6will be

b = 6 + 6;

因为第二个参数将首先被评估为 6(b++将首先返回原始值,然后是增量b),并且由于您将结果 (12 = 6 + 6) 分配给b增量将无关紧要,b 将变为 12。

于 2013-09-09T22:24:38.177 回答