异或陷阱

一般情况下,交换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;
}

对于数组,迭代器等,情况也是一样,只要是相同地址,就有异或陷阱。

猜你喜欢

转载自blog.csdn.net/nameofcsdn/article/details/107501046