编程陷阱

异或陷阱

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值