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;
}
浙公网安备 33010602011771号