【C语言笔记】【linux宏定义系列】 三个数中的最小值 min3
linux宏定义系列内容。用于记录在linux kernel之中各式各样的宏定义☺。
宏定义说明
用于比较三个数中数值的最小值。例如 x = 35 x=35 x=35, y = 68 y=68 y=68, z = 54 z=54 z=54,会得到35。
这个宏会进行严格的类型检查。
该宏定义来自linux kernel 3.10。
实现代码
#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); })
宏定义中:
x表示要判断的第一个数。
y表示要判断的第二个数。
z表示要判断的第三个数。
示例程序
示例程序用于计算x,y,z三个数中的最小值。
int main(int argc, char* argv[])
{
int x, y, z;
x = 35;
y = 68;
z = 54;
printf("min3 : %d\n", min3(x, y, z));
return 0;
}
实现过程
-
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)
判断
_min1
和_min2
这两个数哪一个比较小,较小的数再和_min3
进行比较看哪个数比较小,最后得到这三个数中的最小值。
[参考资料]
linux kernel 3.10
/include/linux/kernel.h
本文链接:https://blog.csdn.net/u012028275/article/details/118060854