我发现以下代码在没有第三个变量的情况下交换两个整数:
a=b+(b=a)*0
任何人都可以详细解释一下吗?提前谢谢。
答案 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的总和。