题目
读入两个整数,分别用(1)临时变量、(2)不用第三个变量两种方式交换后输出。
输入格式:一行输入两个整数 a 和 b,以空格分隔。
输出格式:分别输出原值、临时变量交换后的值、异或交换后的值。
数据范围与约定:-109 ≤ a, b ≤ 109。
思路与算法
1. 临时变量交换(工程首选)
借助第三个变量 t = *x; *x = *y; *y = t;。优点是语义清晰直观、支持任意数据类型,无溢出与别名风险,实际开发中推荐使用。
2. 异或位运算交换
利用异或性质 x ^ x = 0 以及 x ^ 0 = x,连续三次异或即可在无额外空间下交换两数:*x ^= *y; *y ^= *x; *x ^= *y;。
陷阱提醒:若指针 x 与 y 指向同一内存地址(自交换),第一次异或后该地址的值会被强制清零,因此异或法不可用于自交换。
3. 指针传参修改实参
C 语言函数参数均为值传递,要在函数内部改变外部变量的值,必须传递变量的内存地址(指针),通过解引用 *x 操作目标值。
完整程序
#include <stdio.h>
// 方式一:临时变量法(工程首选,通用且无溢出风险)
static void swap_temp(int *x, int *y)
{
int t = *x;
*x = *y;
*y = t;
}
// 方式二:异或运算法(利用 a ^ a = 0 与 a ^ 0 = a 性质,注意不可用于同一变量自交换)
static void swap_xor(int *x, int *y)
{
*x ^= *y;
*y ^= *x;
*x ^= *y;
}
int main(void)
{
int a, b;
if (scanf("%d %d", &a, &b) != 2) {
return 1;
}
printf("原值: %d %d\n", a, b);
// 传递指针(变量内存地址),才能在函数内部修改实参的值
swap_temp(&a, &b);
printf("临时变量交换后: %d %d\n", a, b);
swap_xor(&a, &b);
printf("异或交换后: %d %d\n", a, b);
return 0;
}运行示例
输入:
3 7输出:
原值: 3 7
临时变量交换后: 7 3
异或交换后: 3 7