实现一个swap
函数,交换两个变量数值,并分析每种方式的区别!
中间变量交换法
代码如下:
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
优点:1.简单,可读性强;2.如果a和b引用的是同一个变量,原变量值不受影响;
缺点:需要开辟一个中间变量
加减乘除法预算
代码如下:
void swap(int *a, int *b) {
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
}
优点:省去中间变量,可读性强;
缺点:1.可能产生数值溢出问题;2.如果a和b引用的是同一个变量,结果会变为0;
原理:求和求差还原数值;加减乘除均可使用这种思想;
异或交换
代码如下:
void swap(int *a, int *b) {
*a = *a^*b;
*b = *a^*b;
*a = *a^*b;
}
优点:没有产生进位 / 借位,不会产生溢出问题
缺点:如果a和b引用的是同一个变量,结果会变为0;
原理:同上,本质是通过差异推算
差异法推算
简单来说,我们只要知道a和b的差异(diff),就可以用a和diff推算出b,也可以用b和diff推算出a...
a^b=diff (a和b的差异是diff)
a^diff=b (a和diff的差异是什么呢?当然是b)
b^diff=a (b和diff的差异是什么呢?当然是a)
此外还有位与运算等其他方法,这里不作介绍;
以上方法, 时间效率上面不会有太大差别,作者推荐优先使用 中间变量法
,易读,运算结果准确;
网友评论