使用typeof 实现全能数据交换
2013-02-18 23:45
288 查看
初学C语言的时候,我们都接触过数据交换的方法和技巧,最典型的就是swap函数,这个方法
在数据排序的时候是肯定会被用到的,下面就是swap函数的一个例子:
这种方法简单明了,就是创建一个临时变量来保存数据并稍做一些数据移动就行,当然数据交换
还有一种不用创建临时变量的方法,就是使用逻辑与运算,代码如下:
这种方法使用到位运算的技巧,理论上是最快速的方法,但是可读性太差,不推荐使用,其实仅仅一个
数据交换功能这么短的代码量,甚至不应该使用一个函数来完成,使用函数要付出调用栈的开销,应该
使用宏定义,c语言linux内核就是大量应用了宏提高了内核运行的速度。
以上的方法很明显有一个弊端就是定义方法后只能实现一种类型的数据的交换,比如上面的函数
只可以实现int类型数据的交换,如果要交换的数据是char、float、double类型的,那就必须在定义相关
的交换函数,很繁琐也很累赘,typeof关键字的使用可以帮助我们避免这种无聊的近乎重复的工作,结合
刚才的描述可定义一个宏如下:
使用这个宏,不管要交换的数据类型是char还是int还是float都一样可以实现交换,这就是typeof的好处
在数据排序的时候是肯定会被用到的,下面就是swap函数的一个例子:
void swap(int *a , int *b) { int tmp = *a; *a = *b; *b = tmp; }
这种方法简单明了,就是创建一个临时变量来保存数据并稍做一些数据移动就行,当然数据交换
还有一种不用创建临时变量的方法,就是使用逻辑与运算,代码如下:
void swap(int *a, int *b) { *a = *a ^ *b; *b = *a ^ *b; *a = *a ^ *b; }
这种方法使用到位运算的技巧,理论上是最快速的方法,但是可读性太差,不推荐使用,其实仅仅一个
数据交换功能这么短的代码量,甚至不应该使用一个函数来完成,使用函数要付出调用栈的开销,应该
使用宏定义,c语言linux内核就是大量应用了宏提高了内核运行的速度。
以上的方法很明显有一个弊端就是定义方法后只能实现一种类型的数据的交换,比如上面的函数
只可以实现int类型数据的交换,如果要交换的数据是char、float、double类型的,那就必须在定义相关
的交换函数,很繁琐也很累赘,typeof关键字的使用可以帮助我们避免这种无聊的近乎重复的工作,结合
刚才的描述可定义一个宏如下:
#define SWAP(a, b) do {\ typeof(a) _t = a; a = b; b = _t; }while(0)
使用这个宏,不管要交换的数据类型是char还是int还是float都一样可以实现交换,这就是typeof的好处
相关文章推荐
- BizTalk Server 基于消息的基本数据交换(二) - 使用属性提升 实现根据消息内容的路由及订阅
- 大三学长带我学习JAVA.作业2. 第二讲(原生数据类型 Primitive Data Type)。第三讲(原生数据类型使用陷阱 Pitfall of Primitive Data Type)。大三学长带我学习JAVA.作业2.
- 使用存储过程实现数据的交换
- Android Binder机制实现进程间数据交换(不使用aidl实现)
- JSON 、使用JSON实现数据交换 、jQuery对AJAX的支持
- java学习——使用Exchanger实现两个线程间的数据交换
- 安卓使用aidl实现两个程序之间的数据交换
- 圣思园张龙-Java SE 第三讲(原生数据类型使用陷阱 Pitfall of Primitive Data Type)
- 关于数据类型的判断不使用typeof的精确定位
- (JAVA SE 学习笔记)Java.SE.第003讲.原生数据类型使用陷阱.Pitfall.of.Primitive.Data.Type
- boost在自己主动确定数据类型(BOOST_TYPEOF和BOOST_AUTO)使用
- 使用ADO操作SQL SERVER 通过'OLE DB 访问 ACCESS 数据库 ,实现数据交换
- 使用指针实现数据交换
- Unit02: JSON 、 使用JSON实现数据交换 、 jQuery对AJAX的支持,编码问题
- 使用Enumerable.OfType<T>扩展方法实现非泛型集合的Linq查询
- android使用JSON进行网络数据交换(服务端、客户端)的实现
- android使用JSON进行网络数据交换(服务端、客户端)的实现
- Windows CE下使用共享内存实现进程间数据交换
- ASP.NET中使用JSON方便实现前台与后台的数据交换
- Java SE 第三讲(原生数据类型使用陷阱 Pitfall of Primitive Data Type)