你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

交换a、b的值在C语言的学习中是很常见的问题

[复制链接]
gaosmile 发布时间:2020-11-16 20:27
[导读]交换a、b的值在C语言的学习中是很常见的问题,但最常用的方法就是引入一个中间变量当做中间介质来交换a、b的值。( [$ R8 [# ?* e* @# x

交换a、b的值在C语言的学习中是很常见的问题。最常用的方法就是引入一个中间变量当做中间介质来交换a、b的值。

代码如下:

void change_ab(int *a, int *b)
- L- g  A5 ]1 i- m{& z/ a. V9 F7 C/ L+ @, B$ C
    int temp = 0;% X# ^" W  r8 X* K

+ Q' w$ R# p% D8 x' s    temp = *a;. A2 X& K! Y3 ~
    *a = *b;
. r8 Y  d) @, ?    *b = temp;
5 a5 Z  j! T) y}1 s1 c+ O2 K, {, p/ D. N) [$ r


9 }2 d7 K: Y8 d8 X; d% C! x' m2 V

注意,不能写为如下代码:

void change_ab(int a, int b)& c( t) M3 l8 b) @+ D7 }1 M
{; o! L! x9 b' X! ?0 h6 K
    int temp = 0;
  f; B3 K- Z# ~  o3 a5 h
+ _+ t; j* z! E9 `    temp = a;
+ Q; L/ ?  ?( F  ~& x- k    a = b;
. l0 Q: J& Z4 D2 t$ n. m; h    b = temp;4 O( _! O& ~) R) C. K& I9 J* o
}2 R8 O' }+ q9 P% Y2 N

普通的变量传递,则不会改变内存内容,以为普通变量作为参数时,其实是在内存块(栈空间)中新申请了一块空闲块,不是原来的内存块,而函数调用完毕之后,这块新申请的内存块会由于变量的作用域失效而被系统回收。

如果把指针作为实参进行传递,也就是把内存地址传了过去,那么操作这个指针所指向的内存块,必然会改变这个内存的内容了。

以上这种方法就是最常见的方法。那么,你知道如何将a、b的值进行交换,并且不使用任何其他的中间变量?

方法一:采用算术的方法void change_ab(int *a, int *b): u1 X/ Q: C3 T
{  M; p0 i& x8 Q+ [0 S
    *a = *a + *b;: L+ U8 N4 K) q. c7 ?
    *b = *a - *b;
0 x. z3 e. P& C9 a    *a = *a - *b;
5 ^. K4 j7 T9 |& k  e}
5 y) B* `9 y! ]: J5 ~' Q' a: W
方法二:采用异或的方法void change_ab(int *a, int *b)2 _) t, {, g8 s, D% C8 `  i5 i( [
{5 B/ @& h& I) c% A0 P3 v
    *a = *a ^ *b;
8 K, C' G: e, \2 K! x+ E    *b = *a ^ *b;, T2 p! _8 \$ k, s
    *a = *a ^ *b;
" |- ~1 V2 G* P$ C, I" r}
( n% t  h! U- ]- o

方法一存在一个潜在的危险,当形参的类型改为无符号16位时,若a、b的值很大,那么a+b的值就有可能超出16位整数所能表示的范围,从而造成程序运行错误。方法二则没有这个问题,这是一种比较好的方法。

. S( M3 ~/ w6 S$ E

3 r6 z/ b3 _2 J0 P

" }: ^( ]6 r8 }8 ~, \! \& @
! @& j. X7 g, F3 r, B9 a

/ z7 ]2 A) P& g0 u5 z# N; W0 R1 ~5 R/ ^' ]
赞 收藏 评论1 发布时间:2020-11-16 20:27

举报

1个回答
sincomaster 回答时间:2020-11-16 21:38:02
第一次见,感谢分享
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版