C语言使用宏实现2个变量的交换

  记录哪个方法更普适,更高效,这些方法不包括使用函数的方法,如果使用函数的话,使用指针的方法更合适。

  •   使用中间变量

  形如 int tmp, tmp = a; a=b; b = tmp;

 1 #define SWAP(a, b) {typeof(a) _t=a; a=b; b=_t;} 

  通杀,唯一缺点是需要额外的堆栈空间。

  •   使用算术方法

 1 #define SWAP(x, y) (x) = (x)+(y); (y) = (x)-(y);(x) = (x)-(y); 

   不能使用,x+y会有可能导致数据溢出,那么就玩完了,且只能对基本数据类型操作,构造数据类型不能使用。

  •   费脑异或法

 1 #define SWAP(x, y) (x)^=(y); (y)^=(x);(x)^=(y); 

  费脑,且只能对基本数据类型操作,构造数据类型不能使用。

那么对比1,3的效率,分别使用2个宏运行如下代码:

int main(int argc, const char *argv[])
{
    unsigned int k = 0xFFFFFFF;
    
    int a = 5;
    int b = 10;

    while ( k-- )
    {
        SWAP(a, b);
    }
    return 0;
}

使用 time ./main 计时,异或法耗时2.2-2.4s, 中间变量法耗时0.7-0.8s,效率提高了3倍。

原文地址:https://www.cnblogs.com/thammer/p/4491208.html