绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
C语言经典例题来袭!5大方法告诉你答案
2019-12-03 10:47:19

各位,今天我们来看一个C语言的经典例题,因为近有不少人后台问的问题都跟这个或多或少有点关系,所以今天咱们拿出来对这类问题进行一个总结,话不多说,就问下面的代码会输出什么?

#include

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语言

由点及面是一种重要且有效的学习方法,所以我们想通过本例对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;

}

C语言

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;

}

C语言

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;

}

C语言

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种方法之一,为了大家好理解,我们才暂且这么划分的。

分享好友

分享这个小栈给你的朋友们,一起进步吧。

IT知识联盟
创建时间:2019-07-05 15:30:45
分享收集到的大小知识点
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

栈主、嘉宾

查看更多
  • 王超
    栈主

小栈成员

查看更多
  • ?
  • youou
  • gamebus
  • chinacc
戳我,来吐槽~