方法一:使用临时变量
void my_switch(int* a, int* b) {
int p = *a;
*a = *b;
*b = p;
}
这是最直接和传统的交换两个数字的方法:
- 使用一个临时变量
p
来保存*a
的值。 - 然后将
*b
的值赋给*a
。 - 最后,将存储在
p
中的值(*a
的原始值)赋给*b
。
这种方法安全可靠,没有特殊限制或边缘情况。
方法二:使用XOR位运算
void my_switch(int* a, int* b) {
*a = *a ^ *b;
*b = *b ^ *a;
*a = *a ^ *b;
}
这种方法使用XOR(异或)位运算来交换值,无需临时变量:
*a
变为*a
和*b
的XOR值。- 接着对这个新的
*a
值和*b
进行XOR运算,实际上得到的是*a
的原始值。 - 最后,
*a
与新的*b
(现在保存着*a
的原始值)再次进行XOR运算,完成交换。
XOR交换方法有一个明显的缺点:如果a
和b
指向相同的内存地址(这会将该地址的值归零),那么它将失败。但在实际场景中,变量通常是不同的,这种情况很少发生。
方法三:使用加法和减法
void my_switch(int* a, int* b) {
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
}
这种方法使用加法和减法来交换值:
*a
被赋值为*a
和*b
的和。- 然后
*b
被赋值为新的*a
减去原始的*b
,这样得到的就是*a
的原始值。 - 最后,
*a
被赋值为新的*a
减去新的*b
(现在保存着*a
的原始值)。
如果*a
和*b
是非常大的整数,加法和减法方法可能会有问题,因为求和可能导致整数溢出,这在C语言中是未定义行为。
main函数
main
函数简单地初始化了两个整数a
和b
,从用户那里读取它们的值,调用其中一个my_switch
函数来交换它们的值,然后打印交换后的值。
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
my_switch(&a,&b);
printf("%d %d", a, b);
return 0;
}