在编写代码时,我们有时会遇到交换两个变量的值的需求,很容易产生这样的想法:能不能将交换变量的值的逻辑提出来,成为一个单独的函数呢?
错误示例:
void swap1(int a, int b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int x = 10;
int y = 20;
swap1(x, y);
printf("x = %d\n", x);
printf("y = %d\n", y);
return 0;
}
输出结果:
x = 10
y = 20
为什么交换无效呢?
原因是,当实参传递给形参时,实际上形参是实参的一个临时拷贝,即与实参不同的另外一个值(但字面值相同),对形参的一系列操作无法作用到实参上,自然无法达到交换两个实参的效果。
在C / C++ 中,可以使用指针来实现交换两个参数的函数:
void swap2(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int x = 10;
int y = 20;
swap2(&x, &y);
printf("x = %d\n", x);
printf("y = %d\n", y);
return 0;
}
输出结果:
x = 20
y = 10
Triumph! :)
而在 Java 中,由于没有指针的概念,因此直接无法写出交换两个基本数据类型的变量的方法(Method). 而对于引用数据类型,由于传入参数实际为对象的引用,所以可以轻松做到对实际对象的某些字段进行交换。
事实上,使用数组作为参数可以变相做到对两个基本数据类型的变量的值进行交换的操作,详见https://www.zhihu.com/question/515961668/answer/2362079738;但说实话这样过于繁琐,实际开发中并不常见。
↑