本帖最后由 LOVEEVER 于 2023-12-16 14:04 编辑
2写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个。
- #define MIN(a,b) ((a)<=(b)?(a):(b))
考察点:
1-标识#define在宏中应用的基本知识。这是很重要的。因为在 嵌入(inline)操作符 变为标准C的一部分之前,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。
2-懂得在宏中小心地把参数用括号括起来
3-我也用这个问题开始讨论宏的副作用,例如:当你写下面的代码时会发生什么事?
宏定义的作用结果MIN(*p++,b) ((*p++)<(b)?(*p++),b) 指针p会做两次自增操作
如何消除宏的副作用
C语言学习资源汇总【最新版】
- #include <stdio.h>
- #define min_i(x,y) ((x)<=(y)?(x):(y)) //(1)
- #define min_t(type,x,y) ({type _x = x;\ //(2)
- type _y = y;\
- _x<_y?_x:_y;\
- })
- #define min(x,y) {const typeof(x) _x = (x);\ //(3)
- const typeof(y) _y = (y);\
- (void)(&_x=&_y);\ //(4)
- _x<_y?_x:_y;\
- })
- int main()
- {
- int a = 10;
- int b = 20;
- printf("min_i(a++,b++)=%d\n",min_i(a++,b++)); //11
- printf("a=%d\n",a); //12
- printf("b=%d\n",b); //21
- a=10;
- b=20;
- printf("min_t(int,a++,b++)=%d\n",min_t(int,a++,b++)); //10
- printf("a=%d\n",a); //11
- printf("b=%d\n",b); //21
- a=10;
- b=20;
- printf("min(a++,b++)=%d\n",min(a++,b++)); //10
- printf("a=%d\n",a); //11
- printf("b=%d\n",b); //21
-
- }
1-这个定义计算x和y分别两次(x和y中的小者被计算两次),当参数由副作用时,将产生不正确的结果
2-使用语句表达式只计算参数一次,避免了可能的错误,语句表达式通常用于宏定义
3-typeof(x)表示x的值类型
4-检查参数x和y的类型是否相同(如果x和y的类型不同编译器将会发出warning,并不影响后面语句的运行
|