我从我的一个朋友那里听说,交换的最佳算法是 “(a ^ = b ^ = a ^ = b)” 其中a和b是要交换的两个整数。 但是当我使用c语言应用它时,它导致崩溃。 你们中的任何人都可以解释可能的原因吗? 请建议最佳的交换算法。 谢谢!!!! 伙计们,我想知道崩溃的原因。
答案 0 :(得分:10)
a^=b^=a^=b;
可能会崩溃,因为它会调用可怕的未定义行为。它破坏的规则是它在没有插入序列点的情况下两次修改a
。可以通过插入一些序列点来修复它 - 例如,使用逗号运算符:
a ^= (b ^= a ^= b, b);`
或者将其分解为多个陈述:
b ^= a ^= b; a ^= b;
但是,它仍然是交换变量的一种不好的方法 - 其他几个答案和评论已经充分解释了原因。
答案 1 :(得分:9)
这种交换技巧有时是危险的,我看到一个错误的快速排序程序使用这个交换会产生错误的结果。但通常的交换产生正确的程序。
如果我们使用tmp变量,编译器有时会生成更快的代码。
使用tmp = a; a = b; b = tmp;
答案 2 :(得分:3)
请参阅http://en.wikipedia.org/wiki/Swap_(computer_science)。
使用临时变量会产生更多开销,但比XOR交换算法更稳定,并行计算使其比XOR交换更快。
请参阅http://www.ibm.com/developerworks/linux/library/l-metaprog1.html的第一个代码示例,了解使用临时变量进行交换的可靠实现。
答案 3 :(得分:0)
编写人类更快阅读的代码。并且信任编译器能够在大多数时间生成更好的代码。进行分析,看看这是否是提高速度的唯一地方。然后应用上面多次列出的XOR解决方案,它可能无法在任何地方工作。
答案 4 :(得分:0)
好吧,在这种情况下,我们可以使用数学交换两个不带第三个变量的数字
假设您有两个变量 A = 10和B = 20 因此,如果同时添加它们,则总权利为 30 。
现在,如果您从总数中减去A ,那么您将得到 B ;如果您从总数中减去B ,那么您将得到<因此,strong> A 。
例如:
A = (A+B)-A; //(10 + 20) -10; ===> we will get 20 as a result
B = (A+B)-B; //(10 + 20) -20; ===> we will get 10 as a result
因此,通过这种技术,您了解到,从两个数字的总和中减去一个数字,我们将得到另一个数字。
因此,下面列出了交换两个数字的最终答案
A=(A+B)-(B=A)
所以这里我们从A和B的总数中减去A,所以我们得到A中的B,然后通过赋值得到B中A的值;``
答案 5 :(得分:-2)
将此逻辑用于数值:
int a = 10, b =5 ;
a = a-b;
b = b+a ; // b gets the original value of a
a = b - a; // a gets the original value of b
printf ("value : %d %d \n",a ,b) ;