异或陷阱
一般情况下,交换2个数据,我们有2种写法:
void change1(int *p1,int *p2)
{
int tmp=*p1;
*p1=*p2;
*p2=tmp;
}
void change2(int *p1,int *p2)
{
*p1^=*p2^=*p1^=*p2;
}
int main()
{
int a=1,b=2;
cout<<"a b"<<endl<<a<<" "<<b<<endl;
change1(&a,&b);
cout<<a<<" "<<b<<endl;
change2(&a,&b);
cout<<a<<" "<<b<<endl;
return NORMAL_CODE;
}
无论是交换指针指向的数据,还是非指针的数据,这2个写法都可以。
但是,这里有个坑。
如果传入的是2个相同的地址:
void change1(int *p1,int *p2)
{
int tmp=*p1;
*p1=*p2;
*p2=tmp;
}
void change2(int *p1,int *p2)
{
*p1^=*p2^=*p1^=*p2;
}
int main()
{
int a=1;
cout<<"a b"<<endl<<a<<" "<<a<<endl;
change1(&a,&a);
cout<<a<<" "<<a<<endl;
change2(&a,&a);
cout<<a<<" "<<a<<endl;
return NORMAL_CODE;
}
对于数组,迭代器等,情况也是一样,只要是相同地址,就有异或陷阱。
NAN陷阱
NAN有个诡异的特性:
int main()
{
float x = NAN;
if (x < 0)cout << 12; else cout << 34;
if (x >= 0)cout << 56; else cout << 78;
return 0;
}
输出3478
所以还是要尽量避免使用NAN