C 异或交换算法和使用第三个变量的交换有什么区别吗?

C 异或交换算法和使用第三个变量的交换有什么区别吗?,c,swap,xor,C,Swap,Xor,这两者之间有什么区别吗,就像一个更快或更小一样? 使用一个而不是另一个的好处 使用XOR运算符进行交换 使用第三个变量进行交换 XOR交换并不清楚:大多数人都不理解你的代码在做什么,这被认为是神秘的 拥有自我解释的代码总是更好的,因此,除非存在巨大的性能问题,并且基准测试证明xor方法更快,否则最好使用第三个变量。xor交换不清楚:大多数人不会理解您的代码在做什么,这被认为是神秘的 拥有自解释代码总是更好的,因此,除非存在巨大的性能问题并且基准测试证明xor方法更快,否则最好使用第三个变量。(由

这两者之间有什么区别吗,就像一个更快或更小一样? 使用一个而不是另一个的好处

使用XOR运算符进行交换 使用第三个变量进行交换
XOR交换
并不清楚:大多数人都不理解你的代码在做什么,这被认为是神秘的


拥有自我解释的代码总是更好的,因此,除非存在巨大的性能问题,并且基准测试证明xor方法更快,否则最好使用第三个变量。

xor交换不清楚:大多数人不会理解您的代码在做什么,这被认为是神秘的

拥有自解释代码总是更好的,因此,除非存在巨大的性能问题并且基准测试证明xor方法更快,否则最好使用第三个变量。

(由于您正在读取未初始化的变量,所以两个代码段的行为都未定义)

永远不要使用异或交换

  • 您拥有它的方式(
    a^=b^=a^=b;
    )实际上是未定义的行为,因为您在序列点之间多次修改变量。编译器保留吃掉你的猫的权利

  • 信任编译器进行优化

  • 它只适用于整型

  • 如果
    a
    b
    引用同一个对象,则会失败:如果使用此方法交换通过地址传递的对象,例如
    void xorSwap(int*x,int*y)
    ,则正确的实现需要
    if

  • (由于您正在读取未初始化的变量,因此两个代码段的行为都未定义)

    永远不要使用异或交换

  • 您拥有它的方式(
    a^=b^=a^=b;
    )实际上是未定义的行为,因为您在序列点之间多次修改变量。编译器保留吃掉你的猫的权利

  • 信任编译器进行优化

  • 它只适用于整型

  • 如果
    a
    b
    引用同一个对象,则会失败:如果使用此方法交换通过地址传递的对象,例如
    void xorSwap(int*x,int*y)
    ,则正确的实现需要
    if


  • 为什么不看看它的反汇编和比较呢?对于整数类型,只能使用
    xor
    变量。
    a^=b^=a^=b-在我看来像UB。@dwelch:这取决于底层硬件架构。从理论上讲,即使
    a+=1
    也可能需要第三个资源(以便在将
    a+1
    的值存储到
    a
    之前保持该值)。事实上,我相信在大多数硬件架构上,
    a^=b
    需要第三种资源。@barak manos理解,实现可以做各种事情、优化等。这一点现在已经结束,但仅使用arm和gcc,XOR就按需优化为三个XOR,但有两个装载和两个存储区将它们放入寄存器并返回。使用第三种变量方法,它最终会像人们所希望的那样进入两个加载和两个存储,并在存储上交换寄存器,当用作局部变量时,温度变量会优化,当温度变量是全局变量时,它的成本会更高。如果一切都是局部的,那么它就是死代码,并且得到了优化为什么不查看它的反汇编和比较?对于整数类型,您只能使用
    xor
    变量。
    a^=b^=a^=b-在我看来像UB。@dwelch:这取决于底层硬件架构。从理论上讲,即使
    a+=1
    也可能需要第三个资源(以便在将
    a+1
    的值存储到
    a
    之前保持该值)。事实上,我相信在大多数硬件架构上,
    a^=b
    需要第三种资源。@barak manos理解,实现可以做各种事情、优化等。这一点现在已经结束,但仅使用arm和gcc,XOR就按需优化为三个XOR,但有两个装载和两个存储区将它们放入寄存器并返回。使用第三种变量方法,它最终会像人们所希望的那样进入两个加载和两个存储,并在存储上交换寄存器,当用作局部变量时,温度变量会优化,当温度变量是全局变量时,它的成本会更高。如果所有东西都是本地的,那么它们都是死代码并得到优化
    int a, b;
    a ^= b ^= a ^= b;
    
    int a, b, temp;
    temp = a;
    a = b;
    b = temp;