这绝对是C语言的一个经典例题了!

时间:2022-07-22
本文章向大家介绍这绝对是C语言的一个经典例题了!,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

各位,今天我们来看一个C语言的经典例题,话不多说,就问下面的代码会输出什么?


#include<stdio.h>
void swap(int a, int b)
{
int temp = a;
a = b;
b = temp;
}

int main()
{
int a = 1, b = 2;
swap(a,b);
printf(“%d, %d”, a, b);
return 0;
}

意图很明显,要用swap函数中交换main函数中的a和b的值,但是很明显上述代码是达不到要求的,a和b的值没有发生改变。其实本题就是C中比较有名传址和传值的典型例子,而实现交换main函数中的两个变量的值,需要把两个变量的地址传给swap函数,而不是把两个变量的值传过去,也就是要改成如下代码:


#include<stdio.h>
void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}

int main()
{
int a = 1, b = 2;
swap(&a,&b);
printf(“%d, %d”, a, b);
return 0;
}

至于原因我想大家应该都能理解了,我们不再展开,上面这个例子也是面试经常会考察的点,希望大家熟记。

由点及面是一种重要且有效的学习方法,所以我们想通过本例对C中交换两变量值的知识进行一些总结,方便大家的学习。其实交换两变量的值从大的方向可以分为两类(严格来说下面讲的第一类也属于第二类,我们姑且这么划分),一类是函数外交换,也就是本例采用swap函数交换main函数中两变量值的方法,这里容易出错的点无非就是址和值的问题,不再赘述。

另一类是函数内交换,也就是不通过其他函数,在本函数内完成,这种方法比较多,在前面的推送中也讲过,我总结了下面5种(名称都为我自取):

1临时变量法

方法解释:采用临时变量的方法,作为中间过渡,这是最简单也是大家最容易想到的方法,此法在各种场合应用极多,应该熟练掌握。


#include<stdio.h>
int main(void)
{
     int a=1,b=2,tmp;
     tmp =a;
     a=b;
     b=tmp;
     printf("%d %d",a,b);
     return 0;
 }

2加减交换法

方法解释:顾名思义,使用数学中的加减法进行交换,先把a+b的结果暂时先保存在变量a中,然后通过这改变后的a和原始的b进行减法就可以得到交换后的b,缺点是a+b的结果可能越界。


#include<stdio.h>
int main(void)
{
     int a=1,b=2;
     a = a + b;
     b = a - b;
     a = a - b;
     printf("%d %d",a,b);
     return 0;
 }

3乘除交换法

方法解释:该方法与加减法类似,就是把加减替换为乘除,缺点是因为采用了乘法,因此比加法更容易越界,使用时应谨慎。


#include<stdio.h>
int main(void)
{
     int a=1,b=2;
     a = a * b;
     b = a / b;
     a = a / b;
     printf("%d %d",a,b);
     return 0;
 }

4异或交换法

方法解释:巧妙使用异或运算来进行交换,这种方法主要利用了异或的特性a^b的值先保存到a,因为a^b^b=a所以可以顺利完成交换,这种方法是很完美的,不存在越界的问题。


#include<stdio.h>
int main(void)
{
     int a=1,b=2;
     a = a ^ b;
     b = a ^ b;
     a = a ^ b;
     printf("%d %d",a,b);
     return 0;
 }

5移位交换法

方法解释:这种方法不太常用,原理是把原来的int类型的a的值拆分成高16位和低16位,相当于多了16位的暂存空间可以周转,缺点是如果a或者b超过了16位,这种方法就会出错,此方法较复杂且容易出错,因此不建议大家使用。


#include<stdio.h>
int main(void)
{
     int a=1,b=2;
     a <<= 16;
     a |= b;
     b = a >> 16;
     a = a & 0xffff;
     printf("%d %d",a,b);
     return 0;
 }

看到这里,大家应该明白了为什么我在一开始括号中讲“第一类严格说也属于第二类了吧”,因为就算你在函数外交换,但交换的那个函数依然会用到上面5种方法之一,为了大家好理解,我们才暂且这么划分的。

好了,就讲到这里吧,希望通过上述文章让大家对交换两变量值有重新的认识,感谢各位的耐心阅读!