学过C语言的伙伴都知道,曾经比较两个数,输出最大或最小的一个,或者是比较三个数,输出最大或者最小的那个,又或是两个数交换,又或是绝对值等等,其实这些算法在linux内核中通通都有实现,以下的代码是我从linux内核源码的kernel.c中抠出来的代码,我们来看看:
我们直接上代码:
#include <stdio.h> #include <stdlib.h> /* * min()/max() macros that also do * strict type-checking.. See the * "unnecessary" pointer comparison. */ //比较两个数,如果x>y,输出y,否则输出x #define min(x,y) ({ \ typeof(x) _x = (x); \ typeof(y) _y = (y); \ (void) (&_x == &_y); \ _x < _y ? _x : _y; }) //比较两个数,如果x>y,输出x,否则输出y #define max(x,y) ({ \ typeof(x) _x = (x); \ typeof(y) _y = (y); \ (void) (&_x == &_y); \ _x > _y ? _x : _y; }) //比较三个数的大小 ,输出最小的一项 #define min3(x,y,z) ({ \ typeof(x) _min1 = (x) ; \ typeof(y) _min2 = (y) ; \ typeof(z) _min3 = (z) ; \ (void) (&_min1 == &_min2) ; \ (void) (&_min1 == &_min3) ; \ _min1 < _min2 ? (_min1 < min3 ? _min1 : _min3) ; \ (_min2 < _min3 ? _min2 : _min3) ;} ) //比较三个数的大小 ,输出最大的一项 #define max3(x,y,z) ({ \ typeof(x) _max1 = (x) ; \ typeof(y) _max2 = (y) ; \ typeof(z) _max3 = (z) ; \ (void) (&_max1 == &_max2) ; \ (void) (&_max1 == &_max3) ; \ _max1 > _max2 ? (_max1 > max3 ? _max1 : _max3) ; \ (_max2 > _max3 ? _max2 : _max3) ;} ) //输出绝对值 #define abs(x) ({ \ int __x = (x); \ (__x < 0) ? -__x : __x; \ }) //交换两个数 #define swap(a,b) \ do{typeof(a) __tmp = (a); (a) = (b) ; b = (__tmp) ;}while(0) int main(void) { int ret = 0 ; ret = max(1,2); printf("%d\n",ret); printf("%d\n",abs(-100)); int a = 2 ; int b = 3 ; swap(a,b); printf("%d %d\n",a,b); return 0 ; }
运行结果如图所示:
这些算法在内核中通常用宏的规格来实现,关于C语言很多算法,其实在linux内核中几乎都有,比如链表,树,图,排序,字符串,加密等等的算法和数组结构都有实现,能够深入的去理解linux内核,对学习C语言是非常有帮助的。