我在java中理解复合赋值运算符和赋值运算符时遇到了一些问题。有人可以向我解释这两个运营商真的是如何运作的吗? (Somwhere我发现了一个非常好的示例代码,使用临时变量来解释工作,但遗憾的是我已经失去了它。)非常感谢你的优势。这是我的小例子代码(我已经知道前缀和后缀运算符之间的区别):
int k = 12;
k += k++;
System.out.println(k); // 24 -- why not (12+12)++ == 25?
k = 12;
k += ++k;
System.out.println(k); // 25 -- why not (1+12)+(1+12) == 26?
k = 12;
k = k + k++;
System.out.println(k); // 24 -- why not 25? (12+12)++?
k = 12;
k = k++ + k;
System.out.println(k); // 25 -- why not 24 like the previous one?
k = 12;
k = k + ++k;
System.out.println(k); // 25 -- OK 12+(1+12)
k = 12;
k = ++k + k;
System.out.println(k); // 26 -- why?
答案 0 :(得分:6)
请注意,在所有情况下,k 的赋值都会覆盖右侧可能发生的任何增量。
将评论置于行内:
int k = 12;
k += k++;
System.out.println(k); // 24
k++
表示在之后使用该值增加,因此这与编码k = 12 + 12
k = 12;
k += ++k;
System.out.println(k); // 25
++k
表示在使用该值之前递增,因此这与编码k = 12 + 13
k = 12;
k = k + k++;
System.out.println(k); // 24
k++
表示在之后使用该值增加,因此这与编码k = 12 + 12
k = 12;
k = k++ + k;
System.out.println(k); // 25
k++
表示在之后使用该值增加,因此这与编码k = 12 + 13
k = 12;
k = k + ++k;
System.out.println(k); // 25
++k
表示在使用该值之前递增,因此这与编码k = 12 + 13
k = 12;
k = ++k + k;
System.out.println(k); // 26
++k
表示在使用该值之前递增,然后再次使用该值,因此这与编码k = 13 + 13
答案 1 :(得分:1)
以下是第一种情况的详细解释:
int k = 12;
k += k++;
System.out.println(k);
k += k++;
相当于:
k = k + (k++);
k + (k++);
从左到右进行评估
第一个k的值为12。
k++
被评估为原始值k(即12); k后来递增。
其他帖子很好地解释了其他案例。
但这是一个有趣的案例,显示从左到右的评估和右侧的后增量:
int k = 12;
k = k + k++ + k;
System.out.println(k);
k + (k++) + k;
从左到右进行评估
第一个k的值为12.
第二个k:k++
被评估为k的原始值(即12); k后来增加。
第三个k:现在k的增量值为13(因为它在第二个k之后)
总结果为37(即12 + 12 + 13)。
答案 2 :(得分:0)
从这里稍微完成: http://www.coderanch.com/how-to/java/PostIncrementOperatorAndAssignment
让我们仔细看看“i = i ++”这一行是什么作用:
“i ++”被评估。 “i ++”的值是增量发生之前的i值。 作为评估“i ++”的一部分,i增加1。现在我的值为1; 分配已执行。我被赋予“i ++”的值,这是增量前的i的值 - 即0。 也就是说,“i = i ++”大致转换为
int oldValue = i;
i = i + 1;
i = oldValue;
换句话说,增量最后发生是一种常见的误解。在计算表达式时立即执行增量,并记住增量之前的值以备将来在同一语句中使用。