在 C 语言中,不使用额外变量交换两个整数有以下几种常见方法:

方法1:算术运算(最常用)

#include <stdio.h>

int main() {
    int a = 10, b = 20;
    
    printf("交换前: a = %d, b = %d\n", a, b);
    
    // 使用加减法
    a = a + b;  // a = 30
    b = a - b;  // b = 30 - 20 = 10
    a = a - b;  // a = 30 - 10 = 20
    
    printf("交换后: a = %d, b = %d\n", a, b);
    return 0;
}

方法2:异或运算(避免溢出)

#include <stdio.h>

int main() {
    int a = 10, b = 20;
    
    printf("交换前: a = %d, b = %d\n", a, b);
    
    // 使用异或运算
    a = a ^ b;  // a = 10 ^ 20
    b = a ^ b;  // b = (10 ^ 20) ^ 20 = 10
    a = a ^ b;  // a = (10 ^ 20) ^ 10 = 20
    
    printf("交换后: a = %d, b = %d\n", a, b);
    return 0;
}

方法3:乘除法(不推荐)

#include <stdio.h>

int main() {
    int a = 10, b = 20;
    
    printf("交换前: a = %d, b = %d\n", a, b);
    
    // 注意:如果a或b为0,这种方法会出错
    a = a * b;  // a = 200
    b = a / b;  // b = 200 / 20 = 10
    a = a / b;  // a = 200 / 10 = 20
    
    printf("交换后: a = %d, b = %d\n", a, b);
    return 0;
}

完整示例代码

#include <stdio.h>

// 函数版本:使用异或运算
void swap_xor(int *a, int *b) {
    if (a == b) return;  // 防止同一变量交换
    
    *a = *a ^ *b;
    *b = *a ^ *b;
    *a = *a ^ *b;
}

// 函数版本:使用加减法
void swap_arithmetic(int *a, int *b) {
    *a = *a + *b;
    *b = *a - *b;
    *a = *a - *b;
}

int main() {
    int x = 10, y = 20;
    int m = 15, n = 25;
    
    printf("原始值: x=%d, y=%d\n", x, y);
    printf("原始值: m=%d, n=%d\n", m, n);
    
    // 使用异或交换
    swap_xor(&x, &y);
    printf("异或交换后: x=%d, y=%d\n", x, y);
    
    // 使用算术交换
    swap_arithmetic(&m, &n);
    printf("算术交换后: m=%d, n=%d\n", m, n);
    
    return 0;
}

注意事项

  1. 加减法问题:
    · 可能溢出(当 a+b 超出整数范围)
    · 代码可读性较差
  2. 异或法特点:
    · 不会溢出
    · 不能用于浮点数
    · 同一变量交换会出错(需要额外判断)
  3. 实际建议:
    · 生产代码建议使用临时变量,可读性更好
    · 这些技巧主要用于面试或特定场景优化
    · 临时变量方法更安全:
    void swap_normal(int *a, int *b) {
        int temp = *a;
        *a = *b;
        *b = temp;
    }
    

最推荐的实现

#include <stdio.h>

// 使用宏定义,避免函数调用的开销
#define SWAP(a, b) do { \
    (a) = (a) ^ (b);    \
    (b) = (a) ^ (b);    \
    (a) = (a) ^ (b);    \
} while(0)

int main() {
    int a = 10, b = 20;
    
    printf("交换前: a=%d, b=%d\n", a, b);
    
    // 使用宏
    SWAP(a, b);
    
    printf("交换后: a=%d, b=%d\n", a, b);
    
    return 0;
}

选择哪种方法取决于具体场景:如果需要避免溢出且操作整数,推荐使用异或法;如果注重代码可读性,建议还是使用临时变量。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐