在java中,我理解复合赋值运算符和赋值运算符有一些问题。有人能向我解释一下这两个运算符到底是如何工作的吗?(在某些地方,我找到了一个非常好的示例代码,使用临时变量来解释工作,但遗憾的是,我已经失去了它。)非常感谢您的优待。下面是它们的小示例代码(我已经知道前缀和后缀操作符之间的区别):
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?发布于 2011-09-13 21:46:56
注意,在所有情况下,对k的赋值覆盖了在右侧可能发生的任何增量。
发表评论意见:
int k = 12;
k += k++;
System.out.println(k); // 24k++的意思是在使用了值之后增加,所以这与编码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); // 24k++的意思是在使用了值之后增加,所以这与编码k = 12 + 12相同
k = 12;
k = k++ + k;
System.out.println(k); // 25k++的意思是在使用了值之后增加,所以这与编码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相同。
发布于 2014-06-13 15:41:56
以下是对第一种情况的详细解释:
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)。
发布于 2011-09-19 09:41:26
从这里开始一个小小的完成:http://www.coderanch.com/how-to/java/PostIncrementOperatorAndAssignment
让我们仔细看看"i = i++;“行是做什么的:
"i++“被评估。"i++“的值是增量发生前的i值。作为"i++“评估的一部分,我将增加一个。现在我的值为1;赋值被执行。我被赋予"i++“的值,这是增量之前的i值,即0。也就是说,"i = i++“大致翻译为
int oldValue = i;
i = i + 1;
i = oldValue; 换句话说,人们普遍错误地认为增量是最后发生的。在计算表达式时立即执行增量,并记住增量之前的值,以便以后在同一语句中使用。
https://stackoverflow.com/questions/7408877
复制相似问题