C语言:实现两个整数交换的所有方法

1. 使用临时变量(最常用)

void swap_temp(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

优点:简单直观,可读性好,适用于所有数据类型
缺点:需要额外的存储空间 

2. 算术运算法(加减法) 

void swap_arithmetic(int *a, int *b) {
    *a = *a + *b;
    *b = *a - *b;
    *a = *a - *b;
}

优点:不使用临时变量
缺点:可能发生整数溢出

3. 位运算法(异或交换)

void swap_xor(int *a, int *b) {
    *a = *a ^ *b;
    *b = *a ^ *b;
    *a = *a ^ *b;
}

 优点:不使用临时变量,不会溢出
缺点:可读性较差,a和b不能是同一变量(否则会变为0)

 4. 乘除法(不推荐)

void swap_mul_div(int *a, int *b) {
    *a = *a * *b;
    *b = *a / *b;
    *a = *a / *b;
}

 优点:不使用临时变量
缺点:可能溢出,且除数不能为0,效率低

5. 使用宏定义 

#define SWAP_MACRO(a, b) do { \
    typeof(a) temp = a; \
    a = b;              \
    b = temp;           \
} while(0)

优点:类型通用,使用方便
缺点:宏可能带来副作用,调试困难 

 6. 使用指针运算(仅限指针变量)

void swap_ptr(int **a, int **b) {
    int *temp = *a;
    *a = *b;
    *b = temp;
}

优点:适用于指针交换
缺点:仅适用于指针类型

7. 使用结构体(多值交换) 

typedef struct { int x; int y; } Pair;

void swap_struct(Pair *p) {
    int temp = p->x;
    p->x = p->y;
    p->y = temp;
}

优点:可以封装多个值的交换
缺点:需要定义结构体

8. 使用内联汇编(平台相关)

// x86架构示例
void swap_asm(int *a, int *b) {
    asm volatile (
        "movl (%0), %%eax\n"
        "movl (%1), %%ebx\n"
        "movl %%ebx, (%0)\n"
        "movl %%eax, (%1)\n"
        : 
        : "r"(a), "r"(b)
        : "%eax", "%ebx"
    );
}

优点:效率最高
缺点:平台相关,可移植性差

9. 使用C++特性(仅C++可用)

// C++版本
#include <utility>
void swap_cpp(int &a, int &b) {
    std::swap(a, b);
}

优点:标准库实现,安全高效
缺点:仅适用于C++

10. 使用函数指针(复杂方法)

void swap(int *a, int *b, void (*swap_func)(int*, int*)) {
    swap_func(a, b);
}

优点:可以动态选择交换算法
缺点:过于复杂,不实用

 综合比较

方法优点缺点适用场景
临时变量简单可靠需要额外空间通用场景
算术运算无临时变量可能溢出确定不会溢出的场景
位运算无临时变量,不溢出可读性差嵌入式等资源受限环境
宏定义类型通用可能带来副作用需要泛型交换的场景
内联汇编最高效平台相关性能关键代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值