题目:
给定两个整型变量的值,将两个值的内容交换
首先,比较容易想到是,交换两个值的内容我们可以定义一个第三变量,借助第三变量来实现交换(代码如下):
int main(){
int a, b, tmp;
scanf("%d%d", &a, &b);
printf("a=%d b=%d\n", a, b);
tmp = a;
a = b;
b = tmp;
printf("a=%d b=%d\n", a, b);
system("pause");
return 0;
}
运行结果截图:
提升:不允许创建临时变量,交换两个数的内容
加减法:
我们先将 a+b 赋给 a,
再将 a-b 的值赋给 b,则此时就实现了将 a 的值赋给 b;
下一步,再将 a-b 的值赋给 a,则此时就实现了将 b 的值赋给 a,
三步就实现了 a 与 b 值的交换
int main(){
int a, b;
scanf("%d%d", &a, &b);
printf("a=%d b=%d\n", a, b);
a = a + b;
b = a - b; //将a的值赋给b
a = a - b; //将b的值赋给a
printf("a=%d b=%d\n", a, b);
system("pause");
return 0;
}
异或法:
(异或符为: ^ )
(异或法则:相同为0,不同为1)
注意点:任何数和0异或都等于它本身
int main(){
int a, b;
scanf("%d%d", &a, &b);
printf("a=%d b=%d\n", a, b);
a = a^b;
b = a^b;
a = a^b;
printf("a=%d b=%d\n", a, b);
system("pause");
return 0;
}
疑惑:
为什么用下面函数进行交换,结果不变化呢?
Why???(指出错误原因)
void Swap(int a, int b){
int tmp = a;
a = b;
b = tmp;
}
int main(){
int a, b;
scanf("%d%d", &a, &b);
printf("a=%d b=%d\n", a, b);
Swap(a, b);
printf("a=%d b=%d\n", a, b);
system("pause");
return 0;
}
结果如下图所示:
数据并未交换???
原因:
函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参(传值调用),即:
Swap函数里面交换的只是形参变量a,b的值,形参并未把值给实参,而main函数打印的是实参变量a,b的值,所以实参a,b的值并没有发生交换。
改正错误:
传址调用:把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式
(这种传参方式可以让函数和函数外边的变量建立起正真的联系,也就是函数内部可以直接操作函数外部的变量)
void Swap2(int *px, int *py)
{
int tmp = 0;
tmp = *px;
*px = *py;
*py = tmp;
}
int main(){
int a, b;
scanf("%d%d", &a, &b);
printf("a=%d b=%d\n", a, b);
Swap(&a, &b);
printf("a=%d b=%d\n", a, b);
system("pause");
return 0;
}
啾咪啾咪,本章完。