如何解释交换两个整数而不使用第三个变量

时间:2017-09-13 15:49:40

标签: java

我发现以下代码在没有第三个变量的情况下交换两个整数:

a=b+(b=a)*0

任何人都可以详细解释一下吗?提前谢谢。

4 个答案:

答案 0 :(得分:4)

分配变量时,还会返回该变量作为结果。

a=b+(b=a)*0

我们正在为a分配一些价值。这个价值是多少?好吧,它是b + (some quantity) * 0。任何时间0都是0,所以我们知道这一点a = b

同时,在中间,我们正在分配b = a。这些是互换的数量。因为我们在保存b的b之前将(b=a)放在堆栈上。

所以简而言之,如果你考虑一下,它确实会使用一个临时变量。它将b推到堆栈上。

答案 1 :(得分:1)

让我们一点一点地分析它。

  • (b=a)开始,是由括号执行的第一个操作,并为b分配a的值,并返回指定的值(a
  • 该表达式(导致a)乘以0(下一优先级操作)
  • 然后将其添加到b内联(所以a = [old reference to b] + 0
  • 你有它

答案 2 :(得分:1)

我不确定,如果这也可以作为社区帖子:

a=b+(b=a)*0

=> a = b + 0 // multiplication with 0, so 'a' would be assigned the value of 'b'

=> a = b + (b=a) * 0 // basically assign existing value of a to b here

关键是使用现有的值,因为如果表达式被分成多个语句,很可能在评估中使用它们的更新值。

答案 3 :(得分:1)

您可以使用某些值作为示例逐步完成此步骤

a = 10

b = 20

a = b +(b = a)* 0

所以“取消引用”我们得到了以下内容:

a = 20 +(b = 10)* 0

因此我们将10分配给b“动态”并将总和20 + 10 * 0分配给a。首先计算10 * 0,所以我们最终得到

a = 20 + 0

如果没有* 0,a将在交换值之前包含a和b的总和。