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