就是下面的代码:
#include<stdio.h>
void swap(int *a, int *b)
{
*a ^= *b ^= *a ^= *b;
}
int main()
{
int a = 100, b = 1;
swap(&a, &b);
printf("%d %d\n", a, b);
return 0;
}
我使用gcc编译出来结果是0 100,
但是使用g++编译出来是1 100。
嗯,gcc版本gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) 。。谢谢各位
可以参考C标准中关于sequence point的描述。
用gcc编译时加上警告选项-Wsequence-point,就比较明显了。
在C中,()、;、&&、||等等这样的地方是sequence-point。两个sequence-point之间的代码,编译器是可以任意优化的。也就是说,
*a ^= *b ^= *a ^= *b;
的计算顺序是未定义的。C++对sequence point的规定与C基本一致,
*a ^= *b ^= *a ^= *b;
的行为同样是未定义的。另外因为C++规定赋值语句的结果是左值,对这结果也可能会有影响。总之有side effect的写法还是尽量不要用。