题目

读入两个整数,分别用(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