#include<stdio.h>
int main()
{
int a=20,b=30;
a=a+b;
b=a-b;
a=a-b;
return 0;
}
我可以使用此程序交换正值和负值。
答案 0 :(得分:7)
在没有临时持有者的情况下交换变量的算法使用按位XOR运算,而不是减法运算。因此,使用名为a
和b
的变量,我们有:
a=a^b;
b=a^b;
a=a^b;
编辑:您的代码 适用于我使用a
和b
的一些整数值对其进行测试的少数情况,但XOR是执行此操作的常规方法。正如评论者@wildplasser指出的那样,XOR是惯例的原因是整数加法和减法可能会溢出,结果不正确,而XOR则不能。
答案 1 :(得分:4)
This method will not work if a+b
overflows as this invokes undefined behavior.
It's better to use the XOR method. Even better, use a temp anyway as it's more clear.
答案 2 :(得分:3)
正如其他人所指出的,你应该使用XOR而不是算术运算符来避免因签名溢出而导致的UB。
但请记住,在大多数常见处理器(x86,ARM,68k等)中,3个逻辑操作将比寄存器之间的3个移动更慢(并消耗更多能量)。因此,如果有足够的寄存器(在您的示例中肯定是这种情况)并且启用了优化,则使用临时将比使用bit twiddling更快。最后,一些架构有一个交换指令(例如x86上的xchg
),足够聪明的编译器应该能够使用它,而且速度会更快。
故事的寓意 - 提防过早优化。
答案 3 :(得分:1)
是的,它可以用于正值和负值,但是这个方法的问题是当数字很大时a + b可以超出范围并且可能导致奇怪的行为。 使用temp变量进行交换是一种很好而且简单的方法,所以尽可能使用它。
答案 4 :(得分:1)
没有在C中使用临时变量来交换两个变量的首选方法。
在C中交换两个变量的首选方法是使用临时变量。
不使用临时交换是一个过时的问题。当我们为(b)具有很少寄存器且内存不多的机器编写(a)汇编语言代码时,它可能曾经是一个有趣的问题。但是当我们用更高级别的语言编写C语言时,在具有充足内存和寄存器的机器上,没有什么 - 什么都没有! - 通过尝试消除临时变量获得积极的东西
询问“不使用临时交换两个变量的最佳方法是什么?”很像是问“在不使用马车鞭子的情况下让我的马拉马车的最佳方法是什么?”。
(对不起,但是在不使用临时代码的情况下进行交换可能是一个有趣的智能问题,在任何实际编程情况下,这都是一个容易出错的浪费时间。您可能会提高程序的性能通过消除临时值为零。你引入细微错误的可能性基本上是非零的。)