借助第三方变量的方式
这种方式也是最容易联想到的,通过一个临时变量存储其中一个变量的值来达到交互的目的。
在PHP语言中就如下
function swap(&$a, &$b) {
$tmp = $a;
$a = $b;
$b = $tmp;
}
$a = 1;
$b = 2;
swap($a, $b);
var_dump($a, $b);
// int(2)
// int(1)
那么如果在Golang中就更加简单,因为golang有个特性是函数可以返回多个值,借助这个特性可以一行语句达到交换变量的目的。
func main() {
var a = 1
var b = 2
a,b = b,a
fmt.Println(a, b) // 2 1
}
通过位运算符异或方式
上面所说的方式并不是这次的重点,本次主要想记录一下通过位运算符的方式来交换2个变量,并且不借助于第三方变量。先看代码
function swapByBit(&$a, &$b) {
$a = $a ^ $b;
$b = $a ^ $b;
$a = $a ^ $b;
}
$a = 1;
$b = 2;
swapByBit($a, $b);
var_dump($a, $b);
// int(2)
// int(1)
通过位运算符的方式主要是基于异或(^)运算的如下特性:
- 任意一个变量X与其自身进行异或运算,结果为0,即X^X=0
- 任意一个变量X与0进行异或运算,结果不变,即X^0=X
- 异或运算具有可结合性,即a^b^c =(a^b)^c = a^(b^c)
- 异或运算具有可交换性,即a^b = b^a
更新一波php通过list方法交换2个变量
function swap(&$a, &$b) {
list($a,$b) = [$b, $a];
}
$a = 1;
$b = 2;
swap($a, $b);
var_dump($a, $b);
// int(2)
// int(1)