这种方式是否优先在c中交换两个没有temp的变量?

#include int main() { int a=20,b=30; a=a+b; b=ab; a=ab; return 0; } 

我可以使用此程序交换正值和负值。

没有临时持有者的交换变量的算法使用按位XOR运算,而不是减法运算。 因此,使用名为ab变量,我们有:

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

编辑:您的代码确实适用于我使用ab一些整数值测试它的少数情况,但XOR是传统的方法。 正如评论者@wildplasser指出的那样,XOR是惯例的原因是整数加法和减法可能溢出,给出不正确的结果,而XOR不能。

如果a+b溢出,则此方法将不起作用,因为这会调用未定义的行为。

最好使用XOR方法。 更好的是,无论如何都要使用临时值,因为它更清晰。

正如其他人所指出的,你应该使用XOR而不是算术运算符来避免由于有符号溢出而导致的UB。

但请记住,在大多数常见处理器(x86,ARM,68k等)中,3个逻辑操作将比寄存器之间的3个移动更慢(并且消耗更多能量)。 因此,如果有足够的寄存器可用(在您的示例中肯定是这种情况)并且启用了优化,则使用临时寄存器将比使用bit twiddling更快。 最后,一些架构有一个交换指令(例如x86上的xchg ),一个足够聪明的编译器应该能够使用它,而且会更快。

故事的寓意 – 提防过早优化。

是的,它可用于正值和负值,但这种方法的问题是当数字很大时a + b可能超出范围并且可能导致奇怪的行为。 使用temp变量进行交换是一种很好而且简单的方法,所以尽可能使用它。

没有在C中使用临时变量来交换两个变量的首选方法。

在C中交换两个变量的首选方法是使用临时变量。

不使用临时交换是一个过时的问题。 当我们为(b)具有很少寄存器且内存不多的机器编写(a)汇编语言代码时,它可能曾经是一个有趣的问题。 但是当我们用更高级别的语言编写C语言时,在具有充足内存和寄存器的机器上,什么都没有 – 什么都没有! – 通过尝试消除临时变量获得积极的。

问“在不使用临时的情况下交换两个变量的最佳方法是什么?” 很像是问“在不使用马车鞭子的情况下让我的马拉到我的马车的最佳方法是什么?”。

(对不起那些自以为是的答案,但是在不使用临时代码的情况下进行交换可能是一个有趣的智能问题,在任何实际的编程情况下,这都是一个容易出错的浪费时间。通过消除程序可能会提高程序的性能临时为零。你引入细微错误的可能性基本上是非零的。)