You must take personal responsibility. You can not change the circumstances, the seasons, or the wind, but you can change yourself. -- Jim Rohn |
变量交换,一个很常见的问题啦,N 多地方用到,但每次又有所不同。常见的解法有以下几种,主要区别在于 Swap 函数的形参类型差异。
使用 C 语言描述的解法有以下几种。
》》》 ★ 使用[指针类型]的形参
/** 使用 指针类型 实现参数传递。 **/ #include <stdio.h> int Swap(int *parA, int *parB) { int tmp; tmp = *parA; *parA = *parB; *parB = tmp; } int main(void) { int intA, intB; printf("Enter two numbers\n"); printf("Number one x = "); scanf("%d", &intA); printf("Number two y = "); scanf("%d", &intB); Swap(&intA, &intB); printf("After Swap function \n"); printf("Number one x = %d\n", intA); printf("Number two y = %d\n", intB); }
》》》 ★ 使用[整型类型]的形参
/** 调换两数 Swap 函数参数非 指针 或 引用 类型,在这种情况下,如果需要调换两数 仍然需要使用指针实现。 首先在主函数中获取对应两数的存储地址,然后进行转换操作,以符合 Swap 函数的类型需求。然后再进入 Swap 函数后,进行语义转换,将 对应的取值转换为指针类型进行操作。 **/ #include <stdio.h> void Swap(int x, int y) { printf("In Swap function, and before swap x = %d, y = %d\n", *((int*)x), *((int*)y)); int tmp; int* pX = (int*)x; int* pY = (int*)y; tmp = *pX; *pX = *pY; *pY = tmp; printf("In Swap function, and after swap x = %d, y = %d\n", *pX, *pY); } int main(void) { int x = 23, y = 16; // 进入 Swap 函数之前,两数取值分别为 printf("Before swap x = %d, y = %d\n", x, y); // 进入 Swap 函数之前,两数的地址分别为 printf("Before swap &x = %d, &y = %d\n", (int)&x, (int)&y); Swap((int)&x, (int)&y); printf("After swap x = %d, y = %d\n", x, y); printf("After swap &x = %d, &y = %d\n", (int)&x, (int)&y); }
Swap 函数的交换功能实际并不需要第三个变量就可以实现。下面的两种解法就给出了提示。
》》》★ 使用 [XOR][^] 进行变量的交换
/** 调换两数 Swap 函数参数非 指针 或 引用 类型,在这种情况下,如果需要调换两数 仍然需要使用指针实现。 首先在主函数中获取对应两数的存储地址,然后进行转换操作,以符合 Swap 函数的类型需求。然后再进入 Swap 函数后,进行语义转换,将 对应的取值转换为指针类型进行操作。 **/ #include <stdio.h> void Swap(int x, int y) { printf("In Swap function, and before swap x = %d, y = %d\n", *((int*)x), *((int*)y)); *((int*)x) = *((int*)x) ^ *((int*)y); *((int*)y) = *((int*)x) ^ *((int*)y); *((int*)x) = *((int*)y) ^ *((int*)x); printf("In Swap function, and after swap x = %d, y = %d\n", *((int*)x), *((int*)y)); } int main(void) { int x = 23, y = 16; // 进入 Swap 函数之前,两数取值分别为 printf("Before swap x = %d, y = %d\n", x, y); // 进入 Swap 函数之前,两数的地址分别为 printf("Before swap &x = %d, &y = %d\n", (int)&x, (int)&y); Swap((int)&x, (int)&y); printf("After swap x = %d, y = %d\n", x, y); printf("After swap &x = %d, &y = %d\n", (int)&x, (int)&y); }
》》》★ 使用 [+][-] 进行变量的交换
/** 调换两数 Swap 函数参数非 指针 或 引用 类型,在这种情况下,如果需要调换两数 仍然需要使用指针实现。 首先在主函数中获取对应两数的存储地址,然后进行转换操作,以符合 Swap 函数的类型需求。然后再进入 Swap 函数后,进行语义转换,将 对应的取值转换为指针类型进行操作。 **/ #include <stdio.h> void Swap(int x, int y) { printf("In Swap function, and before swap x = %d, y = %d\n", *((int*)x), *((int*)y)); *((int*)x) = *((int*)x) + *((int*)y); *((int*)y) = *((int*)x) - *((int*)y); *((int*)x) = *((int*)x) - *((int*)y); printf("In Swap function, and after swap x = %d, y = %d\n", *((int*)x), *((int*)y)); } int main(void) { int x = 23, y = 16; // 进入 Swap 函数之前,两数取值分别为 printf("Before swap x = %d, y = %d\n", x, y); // 进入 Swap 函数之前,两数的地址分别为 printf("Before swap &x = %d, &y = %d\n", (int)&x, (int)&y); Swap((int)&x, (int)&y); printf("After swap x = %d, y = %d\n", x, y); printf("After swap &x = %d, &y = %d\n", (int)&x, (int)&y); }
使用 C++ 语言描述的解法。
》》》★ 使用 [C++ 引用类型] 作为形参
/** 使用引用参数 **/ #include <iostream> using namespace std; void Swap(int &x, int &y) { cout << "In Swap function, and before swap x = " << x << ", " << "y = " << y << endl; x = x ^ y; y = x ^ y; x = y ^ x; cout << "In Swap function, and after swap x = " << x << ", " << "y = " << y << endl; } int main(void) { int x = 23, y = 16; // 进入 Swap 函数之前,两数取值分别为 cout << "Before swap x = " << x << ", y = " << y << endl; Swap(x, y); cout << "After swap x = " << x << ", y = " << y << endl; }