XOR交换输出预测

时间:2011-08-16 13:33:51

标签: c swap xor

#include <stdio.h>

void fun(char a[]){

  a[0]^=a[1]^=a[0]^=a[1];

}

int main(int argc, char **argv){

  char b[10];
  b[0]='h';
  b[1]='j';
  fun(b);
  printf("%c",b[0]);

  return 0;
}

此代码有什么问题。它应该交换b[0]b[1],但它不会交换。

2 个答案:

答案 0 :(得分:11)

a[0]^=a[1]^=a[0]^=a[1];

未定义的行为。评估和分配的顺序没有定义。

答案 1 :(得分:3)

The New C Standard. An Economic and Cultural Commentary”一书在第1104页提供了xor-swap的两种变体:

Example
1 #define SWAP(x, y) (x=(x ^ y), y=(x ^ y), x=(x ^ y))

2 #define UNDEFINED_SWAP(x, y) (x ^= y ^= x ^= y) 
     /* Requires right to left evaluation. */

因此,第二个变体不可移植且不正确。