不使用第三个变量的交换两个数 (笔记)

typedef int SWAP_TYPE;  

//交换两个数,不使用第三个变量  
void swap(int &a,int &b,SWAP_TYPE type)  
{  
    switch(type)  
    {  
    case 1:  
        //利用加减法(缺点:a+b可能溢出)  
        a = a + b;  
        b = a - b;  
        a = a - b;  
        break;  
    case 2:  
        //利用一个数异或本身等于0和异或运算符合交换率  
        a = a ^ b;  
        b = a ^ b;  
        a = a ^ b;  
        break;  
    case 3:  
        //乘除  
        a = a * b;   
        b = a / b;   
        a = a / b;  
        break;  
    case 4:  
        //不常见方法1  
        a = a + b - (b = a);  
        break;  
    case 5:  
        //不常见方法2  
        b = a + (a = b)*0;  
        break;  
    default:  
        break;  
    }     
}

作者:JarvisChu
原文链接:不使用第三个变量的交换两个数 (笔记)
版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0

2 条评论

  • Google Chrome 42.0.2311.152 Google Chrome 42.0.2311.152 Windows 8.1 x64 Edition Windows 8.1 x64 Edition
    Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.152 Safari/537.36

    对于case1, 如果你交换同一个变量, 比如swap(i, i, 1), i就变成0了

    回复
    • Google Chrome 49.0.2623.112 Google Chrome 49.0.2623.112 Windows 7 x64 Edition Windows 7 x64 Edition
      Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36

      @Txcig  是的,case1和case2都有这种问题。case 3 4 5正常

      回复

发表评论