#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]
,但它不会交换。
答案 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. */
因此,第二个变体不可移植且不正确。