C语言5种妙招教你轻松搞定变量值交换
更新时间:2023-10-30介绍
变量值交换可能是程序员们最常见的操作之一。在C语言中,我们可以使用下列5种不同的方法来交换变量的值。这个问题看似简单,但是删除第三个变量的值交换有很多变种,我们将使用这个例子来展示这些5种不同的方法,并讲解它们的优缺点,让你能轻松搞定变量值交换。
方法一:使用第三个变量交换
这是最简单、最直观的方法,用一个中间变量来存储两个变量的值,然后再把这两个变量的值相互交换。如下:
void swap(int *x, int *y)
{
int temp = *x;
*x = *y;
*y = temp;
}
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;
}
这个方法简单易懂,并且不容易出错,但是需要引入第三个变量,浪费内存。
方法二:求和差值法
求出两个变量的和,然后用两个变量的和减去第一个变量,得到第二个变量,最后用两个变量的和减去第二个变量,得到第一个变量。如下:
void swap(int *x, int *y)
{
*x = *x + *y;
*y = *x - *y;
*x = *x - *y;
}
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;
}
这个方法是不需要引入第三个变量,但是可能由于两个变量的值过大而导致溢出。
方法三:异或法
使用异或操作符来交换两个变量的值,即a = a ^ b,b = a ^ b,a = a ^ b。
void swap(int *x, int *y)
{
*x = *x ^ *y;
*y = *x ^ *y;
*x = *x ^ *y;
}
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;
}
这个方法同样不需要引入第三个变量,而且不会导致溢出。但是,这种方法仅适用于基本数据类型,如果交换的是结构体或类,需要重新定义一个函数。
方法四:加减法
使用加减法来交换两个变量的值。加上两个变量的差值得到第一个变量,减去两个变量的差值得到第二个变量。
void swap(int *x, int *y)
{
*x = *x + *y;
*y = *x - *y;
*x = *x - *y;
}
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;
}
这个方法同样不需要引入第三个变量,也不会导致溢出。另外,这个方法对于交换浮点数也可行,但是可能会有精度的损失。
方法五:指针法
使用指针来交换两个变量的值。通过指向变量的指针,我们可以直接交换两个变量的值。如下:
void swap(int **x, int **y)
{
int *temp = *x;
*x = *y;
*y = temp;
}
int main()
{
int a = 10, b = 20;
int *ptr1 = &a, *ptr2 = &b;
printf("交换前: %d %d\n", *ptr1, *ptr2);
swap(&ptr1, &ptr2);
printf("交换后: %d %d\n", *ptr1, *ptr2);
return 0;
}
这个方法同样不需要引入第三个变量,不会导致溢出,并且适用于结构体等类型。但是,这个方法需要使用指针,可能比较难懂。