异或陷阱
        【摘要】 
                    一般情况下,交换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种写法:
  
   - 
    
     
    
    
     
      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,作者:csuzhucong,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/nameofcsdn/article/details/107501046
        【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
            cloudbbs@huaweicloud.com
        
        
        
        
        - 点赞
- 收藏
- 关注作者
 
             
           
评论(0)