讨论:最牛X的交换整型数据的方法!!!

千杯不醉-sen 2010-03-31 12:40:59
这应该最牛X的交换整型数据的方法!!!你有更简单的吗?请大虾指教。

#include "stdio.h"
void main()
{
int a=123, b=456;
a^=b^=a^=b;
printf("a=%d b=%d\n",a,b);
}


void main()
{
int a=123, b=456;
a-=b+=a-=b;
printf("a=%d b=%d\n",-a,b);
}


void main()
{
int a=123, b=456;
a+=b-=a+=b;
printf("a=%d b=%d\n",a,-b);
}
...全文
166 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
千杯不醉-sen 2010-03-31
  • 打赏
  • 举报
回复
不过,总的来说,这个局限性太强,不适合使用在编程中。
以下应该是常用的3中方法吧?

//1、t=a;a=b;b=t;
//2、a=a^b;b=b^a;a=a^b;
//3、a=a+b;b=a-b;a=a-b;
千杯不醉-sen 2010-03-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xuwenq 的回复:]
不要太拘泥于这些技巧拉,况且这几种方法你觉得都肯定不会有问题么?
[/Quote]
若是整型,当让不会有问题啦!
小李子 2010-03-31
  • 打赏
  • 举报
回复
不要太拘泥于这些技巧拉,况且这几种方法你觉得都肯定不会有问题么?
BT六眼飞鱼 2010-03-31
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 skinnymonkey 的回复:]

基本上只有一个用处 -

面试的时候问你怎样不用任何额外空间(including temp)实现两个数的交换。
[/Quote]
up~~所谓的奇巧淫技
skinnymonkey 2010-03-31
  • 打赏
  • 举报
回复
基本上只有一个用处 -

面试的时候问你怎样不用任何额外空间(including temp)实现两个数的交换。
FancyMouse 2010-03-31
  • 打赏
  • 举报
回复
>这应该最牛X的交换整型数据的方法!!!
下面3个全都是undefined behavior。俺记得第一种在老的某个gcc版本里开个-O2就会全0。
千杯不醉-sen 2010-03-31
  • 打赏
  • 举报
回复
其实,我只是想和众人的力量将交换数据(排序中常用)的方法统计的罗列以下,共新手以及对交换数据(排序)有疑惑的人提供一个很好的了解平台,让他们少走一些冤枉路,并能从中得到一些新的,准更换为自己的东西,仅此而已。大家有什么关于交换(排序)的好方法,都尽自己一点绵薄之力,应该没什么问题吧?倘若,这都不屑不看,觉的这个问题没什么大的意义,那说明你关于这个问题学会了,可以给大家指点指点。作为学语言的同胞们都很希望看到这一点的!谢谢!
千杯不醉-sen 2010-03-31
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 skinnymonkey 的回复:]
基本上只有一个用处 -

面试的时候问你怎样不用任何额外空间(including temp)实现两个数的交换。
[/Quote]

能不用为什么要用呢?
记不得哪位C++大牛在哪本学习C++的书的前言里面说过

“用C语言1000行源码能完成的工作千万不要用C++重写!”
FingerStyle 2010-03-31
  • 打赏
  • 举报
回复
没啥意义,
千杯不醉-sen 2010-03-31
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 xiakan008 的回复:]
引用 9 楼 skinnymonkey 的回复:

基本上只有一个用处 -

面试的时候问你怎样不用任何额外空间(including temp)实现两个数的交换。

up~~所谓的奇巧淫技
[/Quote]

哈哈,就是就是.......
千杯不醉-sen 2010-03-31
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 mlee79 的回复:]
int 的加减溢出的行为未定义,可能会抛出异常, 当然有问题, unsigned 可以...
你就不怕 swap( a , a ) 挂的很难看么....
绝大多数情况下, 平凡的使用中间变量的办法有利于编译器优化因而有更好的性能...
[/Quote]

若是你说的那样,我会选择如下方法:

void swap(int &x,int &y)
{
int temp;
temp=x;
x=y;
y=temp;

}
void main()
{
int a=123,b=456;
swap(a,b);
printf("a=%d b=%d\n",a,b);
}

或者:

void swap(int * x,int * y)
{
int temp;
temp= * x;
* x = * y;
* y =temp;

}
void main()
{
int a=123,b=456;
swap(&a,&b);
printf("a=%d b=%d\n",a,b);
}
千杯不醉-sen 2010-03-31
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 mlee79 的回复:]
int 的加减溢出的行为未定义,可能会抛出异常, 当然有问题, unsigned 可以...
你就不怕 swap( a , a ) 挂的很难看么....
绝大多数情况下, 平凡的使用中间变量的办法有利于编译器优化因而有更好的性能...
[/Quote]

在交换数据的时候,基本都是不同的两个数据,像 swap( a , a ) 这样的没有必要再来交换。
若是交换 swap( a , b),许可以换一种方法。
像这种构造函数的类型不能和 简单的“娱乐技巧”混淆在一起的嘛!
mLee79 2010-03-31
  • 打赏
  • 举报
回复
int 的加减溢出的行为未定义,可能会抛出异常, 当然有问题, unsigned 可以...
你就不怕 swap( a , a ) 挂的很难看么....
绝大多数情况下, 平凡的使用中间变量的办法有利于编译器优化因而有更好的性能...

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧