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

标签 c swap

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

a = a+b;
b = a-b;
a = a-b;

异或:

a ^= b;
b ^= a;
a ^= b;

但我无法弄清楚如何仅使用 +=-= 来做到这一点。可能吗?

最佳答案

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

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

矩阵A

1 0
0 1

+=-= 表示互相加减行。这意味着行列式要么不改变其符号,要么等于 0。结束矩阵为

0 1
1 0

行列式等于-1,所以你不能得到它

更新: 你有这些操作:

  1. a-=a。一行变为 0,因此 det=0
  2. a+=a。这意味着将一行乘以 2,因此 det A'= 2*det A
  3. a+=b。这意味着初等变换,它不会改变 det
  4. 的值
  5. a-=b。与 3.
  6. 相同

然后将此证明应用于 b-=bb+=bb+=ab-=a。所以行列式不会改变它的符号或者它是 0

更新 2: 正如@Tom 所说,这里是如何在 C# 中执行此操作的示例:http://ideone.com/UzVLML .但是,在 C 中这是不正确的:http://codepad.org/Rmhn9iqb .有人可以阐明 C 和 C# 中 b -= b += b 的区别吗?

关于c - 是否可以仅使用 += 和 -= 而不使用其他运算符或变量来交换两个变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16667075/

相关文章:

c - watcom 内联汇编出现错误 "Illegal use of register"

c - 通过 malloc 生成的数组与不是通过 malloc 生成的数组有何不同

c - 在 C 中的宽字符字符串上使用 regex(3) 函数的可移植方法

JavaScript:按索引交换数组值

CSS 同时旋转和替换图像

php - 使用php通过前端重新排序数据库记录行

c - 如何为 2D 数组设置循环边界以按线程分割工作

c - 查找等于输入的字符

c++ - 交换和 move 无限递归

oracle - 如何使用Oracle交换 `=`之前和之后的值?