题目:实现一个Max 宏,写出该程序的输出
int array[5] = {1, 2, 3, 4, 5};
int *p = &array[0]; // p是array首地址
int max = Max(*p++, 1);
printf("%d %d\n", max, *p); //1,2
讨论i++和++i
Max宏的实现
#define Max(x,y)((x)>(y)?(x):(y))
主要的问题其实就是x,y可能是表达式,为了规避++i,i++的问题,括号加的全一点就成。
输出的解释
p指针指向了数组array的首地址,也就是第一个元素对应的地址,其值为1.
宏定义时一定要注意每个地方要加上圆括号
p++相当于p, p++,所以Max(p++, 1)相当于:
(p++) > (1) ? (p++) : (1)
=>
(1) > (1) ? (p++) : (1)
=>
第一个p++的结果是,p所指向的值变成了2,但是1 > 1为値,所以最终max的值就是1。而后面的(p++)也就不会执行,因此p所指向的地址对应的值就是2,而不是3.
扩展:如果上面的p++改成(++p)如何?
(++p) > (1) ? (++p) : (1)
=>
(2) > (1) ? (*++p) : (1)
=>
max = *++p;
=>
*p = 3,max = 3;
网友评论