异或陷阱

举报
用户已注销 发表于 2021/11/19 03:10:17 2021/11/19
【摘要】 一般情况下,交换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 ...

一般情况下,交换2个数据,我们有2种写法:


  
  1. void change1(int *p1,int *p2)
  2. {
  3. int tmp=*p1;
  4. *p1=*p2;
  5. *p2=tmp;
  6. }
  7. void change2(int *p1,int *p2)
  8. {
  9. *p1^=*p2^=*p1^=*p2;
  10. }
  11. int main()
  12. {
  13. int a=1,b=2;
  14. cout<<"a b"<<endl<<a<<" "<<b<<endl;
  15. change1(&a,&b);
  16. cout<<a<<" "<<b<<endl;
  17. change2(&a,&b);
  18. cout<<a<<" "<<b<<endl;
  19. return NORMAL_CODE;
  20. }

无论是交换指针指向的数据,还是非指针的数据,这2个写法都可以。

但是,这里有个坑。

如果传入的是2个相同的地址:


  
  1. void change1(int *p1,int *p2)
  2. {
  3. int tmp=*p1;
  4. *p1=*p2;
  5. *p2=tmp;
  6. }
  7. void change2(int *p1,int *p2)
  8. {
  9. *p1^=*p2^=*p1^=*p2;
  10. }
  11. int main()
  12. {
  13. int a=1;
  14. cout<<"a b"<<endl<<a<<" "<<a<<endl;
  15. change1(&a,&a);
  16. cout<<a<<" "<<a<<endl;
  17. change2(&a,&a);
  18. cout<<a<<" "<<a<<endl;
  19. return NORMAL_CODE;
  20. }

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

文章来源: blog.csdn.net,作者:csuzhucong,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nameofcsdn/article/details/107501046

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。