免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 128491 | 回复: 36
打印 上一主题 下一主题

[C] 交换两变量的值 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-17 19:10 |只看该作者 |正序浏览
今天看到异或的属性一节,看到一段代码,自认为很经典,贴出来分享下:

  1. void inplace_swap(int *x,int *y)
  2. {
  3.     *x = *x ^ *y;
  4.     *y = *x ^ *y;
  5.     *x = *x ^ *y;
  6. }
复制代码

(PS 书上原话:这种交换方式并没有性能上的优势,它仅仅是一个智力上的消遣)

以前没见过此类处理方法,其实是自己就从没想过,也许是我孤陋寡闻吧

论坛徽章:
0
37 [报告]
发表于 2009-07-30 10:53 |只看该作者
原帖由 rollin7 于 2009-7-17 19:10 发表
今天看到异或的属性一节,看到一段代码,自认为很经典,贴出来分享下:

void inplace_swap(int *x,int *y)
{
    *x = *x ^ *y;
    *y = *x ^ *y;
    *x = *x ^ *y;
}

(PS 书上原话:这种交换方式 ...


这个还好吧,也不是很经典,其实用一个表达式就足够了。
x ^= y ^= x ^= y;
如果编译出错的话,就只好分割成两句了
y ^= x ^= y;
x ^= y;

论坛徽章:
0
36 [报告]
发表于 2009-07-27 20:26 |只看该作者

回复 #1 rollin7 的帖子

论坛徽章:
0
35 [报告]
发表于 2009-07-27 15:49 |只看该作者

回复 #1 rollin7 的帖子

论坛徽章:
0
34 [报告]
发表于 2009-07-25 22:09 |只看该作者
原帖由 fantasy_he 于 2009-7-17 22:52 发表
更经典的是:
y=x+y-(x=(x+y-x));


这个要考虑溢出的问题....

还有这段代码,不一定得到你需要的结果,

在表达式中对y进行赋值,又读了y两次...
类似于v[++i] = i;
...这里表达式的求值顺序是不确定的,依赖于具体平台和实现

论坛徽章:
0
33 [报告]
发表于 2009-07-25 19:58 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
32 [报告]
发表于 2009-07-23 18:56 |只看该作者
原帖由 junyang296 于 2009-7-23 18:54 发表


怎解? char和char好像就不行啊。


自己测试时参数也错了,呵呵。可以的。

论坛徽章:
0
31 [报告]
发表于 2009-07-23 18:54 |只看该作者
而用^这个版本的可以支持32位机器上几乎全部类型的交换(只要字节数相同,完全可以交换)


怎解? char和char好像就不行啊。

论坛徽章:
0
30 [报告]
发表于 2009-07-23 17:53 |只看该作者
原帖由 gigabyte 于 2009-7-19 21:29 发表
更经典的是:
y=x+y-(x=(x+y-x));

+1



这个方案只支持类型相同变量的值交换。

而用^这个版本的可以支持32位机器上几乎全部类型的交换(只要字节数相同,完全可以交换)

论坛徽章:
0
29 [报告]
发表于 2009-07-23 17:39 |只看该作者
原帖由 fantasy_he 于 2009-7-17 22:52 发表
更经典的是:
y=x+y-(x=(x+y-x));


你可以用vs2005编译一下试试,看结果如何
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP