1. 利用第三方临时变量:
temp = x ;
x = y ;
y = temp;
为了避免在更新值时旧值被覆盖掉,先将x的旧值赋给“temp”,从而实现x与y的值交换。
2. 利用加减法的性质:
x = x + y ; //此时x是两值之和,y仍是y的旧值,也即并没有出现信息损失,因为x的旧值可由计算得出
y = x - y ; // “两值之和”减去“y的旧值” 得 “x的旧值” , 存入y,完成第一步交换
x = x - y ; // “两值之和”减去“x的旧值” 得 “y的旧值” , 存入x,完成第二步交换。
3. 利用位异或运算的性质:
x = x ^ y ;
y = x ^ y ;
x = x ^ y ;
位的异或运算,符号为“^”,指在二进制表示法中,按照数位进行的一种运算。运算规则为:对两组数,严格不等的数位值取1,同0或同1的数位值取0.
如:a = 0011 ; b = 0111 ; a ^ b = 0100 ; //a和b仅第二位的值严格不等,故取1,其他数位皆取0.
因为位异或运算是一种可逆运算,故可以用来实现两值交换。
依上例,
a = a ^ b ; // a = 0100
b = a ^ b ; // b = 0011 是a的旧值
a = a ^ b ; // a = 0111 是b的旧值
为什么呢?其实综合第一行和第二行,可得 b = a ^ b ^ b ; 再利用异或运算性质——一个数与自己异或得0 ; 0与任意数异或后不改变其值 。就可以发现此时 b = a 了。同理,第三行是 a = (a ^ b) ^ (a ^ b ^ b) = a ^ b ^ a = b ;
内容来源:菜鸟教程C++传值调用评论区