本帖最后由 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,并不影响后面语句的运行
|