不使用临时变量的swap
一道经典的面试题如下:两个int型变量a和b,不使用临时变量,交换它们的值。
答案相信大家都耳熟能详了:
a = a ^ b;
b = a ^ b;
a = a ^ b;
这段程序巧妙的安排运算顺序利用仅有的两个变量实现swap,它相当于这样一段程序:
c = a ^ b;
b = c ^ b;
a = c ^ b;
可以发现它的技巧简单的说就是把本应放在临时变量c中的值放在了原有变量a中,a的值被覆盖。不过为什么a的值可以被覆盖掉呢?对这段程序一种比较technical的解释就是,它利用了 ^ (异或)运算的性质:
c = a ^ b =>
a = b ^ c
b = a ^ c
但是,大家怎么想起来使用异或呢?使用异或有什么好处呢?两个变量既然要交换,那总归是要赋值的,而在C语言中有不能像Python那样直接一句搞定:
a , b = b , a
所以有这么一个结论:两个变量的最终赋值肯定是有先后顺序的。设a、b的初始值为A、B。假设b先完成赋值,即b已经存储了a的初始值A,现在要把b的初始值B放到a里面去。这时候可用的变量只有a了。也就是说在b完成赋值之后&#