【写在前面】
从开始学编程起,老师一直在问我们一个问题,“想想看,你写的代码还可以再优化吗?”同一道题目,编程方法难易兼有,找最优化的方法,做更专业的程序猿,这是我们的主业。
【热身赛】
从最基础的题目开始,我们来逐步向最优化代码行军。
Q:交换两个给定变量的值。
题目很基础,面试也会有,大家嫑忽视。
很容易大家就可以写出这样的代码:
#include <stdio.h>
int main()
{
int num1 = 2;
int num2 = 3;
int tmp = 0;
tmp = num1;
num1 = num2;
num2 = tmp;
printf("num1=%d num2=%d\n", num1, num2);
}
或者,我们也可以引入swap函数来实现它:
#include <stdio.h>
void swap(int *x,int *y)
{
int tmp = 0;
tmp = *x;
*x = *y;
*y = tmp;
}
int main()
{
int num1 = 2;
int num2 = 3;
swap(&num1, &num2);
printf("num1=%d num2=%d\n", num1, num2);
}
这些都是基础的方法,大同小异。如果这时考官提出,请你不引入第三方变量来做这道题,该如何完成呢?
我们可能会想到用四则运算的方法实现它,以加法为例,其余类比:
#include <stdio.h>
int main()
{
int num1 = 2;
int num2 = 3;
num1 = num1 + num2;
num2 = num1 - num2;
num1 = num1 - num2;
printf("num1=%d num2=%d\n", num1, num2);
}
但是,这种方法也有弊端,数据过大时,可能会产生溢出,这时代码还可以优化吗?如我们所知,数据在计算机中以其二进制补码的形式存储,如果我们能想到用异或的方法去实现它,就真将课本知识学以致用了:
#include <stdio.h>
int main()
{
int num1 = 2;//010
int num2 = 3;//011
num1 = num1^num2;//001
num2 = num1^num2;//010
num1 = num1^num2;//011
printf("num1=%d num2=%d\n", num1, num2);
}
以上结果均见此图
完美。
【结语】
解决问题不是目的,用最优的方法解决问题是所求。“法乎其上,得乎其中”,老祖宗这句话总归没有错的。本次用这个简单的程序让大家明白这一点,后续将继续深入举例,带大家走进严谨的计算机世界,敬请期待。