我已经从朋友矿,对于交换的最佳算法是听到 “(一^ = B ^ = A ^ = b)的” 其中a和b是两个整数被交换。 但是当我应用这个用c语言它导致崩溃。 可有人对你罚款的人解释是,可能的原因? 请建议最好的算法用于交换。 谢谢!!!! 球员我想知道崩溃的原因。

有帮助吗?

解决方案

此交换特技有时是危险的,我已经看到了使用这种交换一个错误的快速排序程序产生错误的结果。但通常的交换产生正确的程序。

对于速度,编译器有时如果我们用一个TMP变量产生快速的代码。

使用tmp = a; a = b; b = tmp;

其他提示

a^=b^=a^=b;可能崩溃,因为它调用可怕的未定义的行为。它打破了规则是它修改a两次中间没有序列点。它可以通过插入一些序列点被固定 - 例如,使用逗号运算符:

a ^= (b ^= a ^= b, b);`

或者通过分解成多个语句:

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

这是静止的,但是,通常用于交换变量不好的方法 - 一些其他的答案和评论已经充分解释为什么

请参阅 http://en.wikipedia.org/wiki/Swap_(computer_science)

使用一个临时变量产生更多的开销,但是大于所述XOR交换算法更稳定和并行计算使得它比XOR交换更快。

请参阅 http://www.ibm的第一代码示例的.com / developerworks的/ LINUX /库/ 1- metaprog1.html 以固体实施使用临时变量用于交换的。

编写代码,更快的读出由人类。和信任编译器的能力,以生成更好的代码的大部分时间。做一个分析,看看这是提高速度的唯一地方。然后应用上述多次列出XOR解决方案中,可能不工作的每一个地方。

  

使用此逻辑为数字值:

    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) ;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top