异或交换输出预测 #包括 虚无乐趣(char a[]{ a[0]^=a[1]^=a[0]^=a[1]; } int main(int argc,字符**argv){ charb[10]; b[0]='h'; b[1]='j'; 乐趣(b); printf(“%c”,b[0]); 返回0; }
这个代码有什么问题。它应该交换异或交换输出预测 #包括 虚无乐趣(char a[]{ a[0]^=a[1]^=a[0]^=a[1]; } int main(int argc,字符**argv){ charb[10]; b[0]='h'; b[1]='j'; 乐趣(b); printf(“%c”,b[0]); 返回0; },c,swap,xor,C,Swap,Xor,这个代码有什么问题。它应该交换b[0]和b[1],但它不交换a[0]^=a[1]^=a[0]^=a[1]。未定义求值和赋值顺序。第1104页的“”一书给出了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);
b[0]
和b[1]
,但它不交换a[0]^=a[1]^=a[0]^=a[1]代码>。未定义求值和赋值顺序。第1104页的“”一书给出了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;
}
因此,第二个变量是不可移植的,并且是不正确的。+1 C99 6.5/2:“在上一个序列点和下一个序列点之间,一个对象的存储值最多只能通过表达式的计算修改一次。此外,访问前一个值只能确定要存储的值。”很好,我想说‘你试过没有链接吗?^=忘记异或,使用临时的——它更可读、更可靠,可能也更有效。有趣的是,人们如何调用他们的函数fun()
,尽管他们不会做有趣的事情。序号:-)
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. */