c语言编程笔录

首页 >   > 笔记大全

笔记大全

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; 
} 

这个方法同样不需要引入第三个变量,不会导致溢出,并且适用于结构体等类型。但是,这个方法需要使用指针,可能比较难懂。