DeepSeek 在 C 语言中,不使用额外变量交换两个整数
·
在 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;
}
注意事项
- 加减法问题:
· 可能溢出(当 a+b 超出整数范围)
· 代码可读性较差 - 异或法特点:
· 不会溢出
· 不能用于浮点数
· 同一变量交换会出错(需要额外判断) - 实际建议:
· 生产代码建议使用临时变量,可读性更好
· 这些技巧主要用于面试或特定场景优化
· 临时变量方法更安全: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;
}
选择哪种方法取决于具体场景:如果需要避免溢出且操作整数,推荐使用异或法;如果注重代码可读性,建议还是使用临时变量。
更多推荐




所有评论(0)