linux内核中的C语言常规算法(前提:你的编译器要支持typeof和type)

简介:

学过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语言是非常有帮助的。

目录
相关文章
|
28天前
|
自然语言处理 算法 搜索推荐
C语言中谈论算法
C语言中谈论算法
10 0
C语言中谈论算法
|
1月前
|
算法 安全 C语言
使用C语言实现DES算法代码
使用C语言实现DES算法代码
|
1月前
|
自然语言处理 算法 搜索推荐
C语言用伪代码表示算法
C语言用伪代码表示算法
25 0
|
15天前
|
算法 C语言
【算法与数据结构】 C语言实现单链表队列详解2
【算法与数据结构】 C语言实现单链表队列详解
|
15天前
|
存储 算法 C语言
【算法与数据结构】 C语言实现单链表队列详解1
【算法与数据结构】 C语言实现单链表队列详解
|
16天前
|
小程序 Linux API
Linux用C语言模拟‘ls‘命令
Linux用C语言模拟‘ls‘命令
11 1
|
17天前
|
Linux 测试技术 C语言
【Linux】应用编程之C语言文件操作
【Linux】应用编程之C语言文件操作
|
25天前
|
存储 机器学习/深度学习 算法
C语言代码实现数据结构与算法
以上代码中,哈希表使用链表解决哈希冲突,每个链表节点包含一个键值对。hash函数用于计算键值对应的哈希值,insert函数用于向哈希表中插入一个键值对,若当前位置为空,则直接插入;否则,将新节点插入到链表末尾。search函数用于在哈希表中查找指定键值的值,若存在则返回其值,否则返回-1。
32 1
|
28天前
|
前端开发 Unix Linux
Linux indent命令 (格式化C语言源代码的程序)
Linux indent命令 (格式化C语言源代码的程序)
17 0
Linux indent命令 (格式化C语言源代码的程序)
|
28天前
|
搜索推荐 算法 C语言
C语言排序算法
C语言排序算法
13 0