是否可以仅使用+ =和 - =交换两个变量?没有其他运算符或变量?

med*_*ick 14 c swap

我想交换两个变量,只有+=-=运营商,没有临时变量.我知道标准解决方案如:

a = a+b;
b = a-b;
a = a-b;
Run Code Online (Sandbox Code Playgroud)

并与xor:

a ^= b;
b ^= a;
a ^= b;
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚如何只用+=-=.可能吗?

med*_*ick 10

我的同学提供了一个很好的解决方案:答案是 NO

让表示a作为(1 0)b作为(0 1)

矩阵A

1 0
0 1
Run Code Online (Sandbox Code Playgroud)

+=并且-=意味着相互增加或减少行.这意味着行列式要么不改变其符号,要么等于0.结束矩阵是

0 1
1 0
Run Code Online (Sandbox Code Playgroud)

与行列式相等-1,所以你无法得到它

更新:你有这些操作:

  1. a-=a.一号线变0,所以det=0
  2. a+=a.这意味着乘以一条线2,所以det A'= 2*det A
  3. a+=b.这意味着初级转型,它不会改变价值det
  4. a-=b.同样的事情3.

然后将此证明了b-=b,b+=b,b+=a,b-=a.因此决定因素不会改变它的符号或它是0

更新2:正如@Tom所说,这里是如何在C#中做到这一点的例子:http://ideone.com/UzVLML .但是,在C语言不正确:http://codepad.org/Rmhn9iqb.有人可以澄清b -= b += bC和C#的区别 吗?