下列程序执行后输出的结果是
#include
#define MIN(x,y) (x)<(y)?(x):(y)
int main()
{
int i=10,j=15,k;
k=10*MIN(i,j);
printf("%d\n",k);
return 0;
}
宏是由预编译器处理的。理解这段代码主要是要明白于编译器如何处理宏。
预编译器对宏执行**简单替换**。
k = 10*MIN(i,j);
MIN(i,j) 替换为(i) < (j) ? (i) : (j) ,替换后与下面的代码等价
k = 10 * (i) < (j) ? (i) : (j);
这样就很好理解了,根据算符优先级,乘法先计算所以上述代码与下面的代码等价:
k = (10 * i ) < j ? i : j;
这样10 * i < j 不成立。j赋值给k,输出值为j的值15;
K=10*10 结果是100
宏是由预编译器处理的。理解这段代码主要是要明白于编译器如何处理宏。
预编译器对宏执行**简单替换**。
k = 10*MIN(i,j);
MIN(i,j) 替换为(i) > (j) ? (i) : (j) ,替换后与下面的代码等价
k = 10 * (i) < (j) ? (i) : (j);
这样就很好理解了,根据算符优先级,乘法先计算所以上述代码与下面的代码等价:
k = (10 * i ) > j ? i : j;
这样10 * i > j成立。i赋值给k,输出值为i的值10;
楼上说的很详细,答案是15
可以参考这篇博文:
http://blog.csdn.net/wzxq123/article/details/51475513
对,答案是15,因为在预处理阶段,将宏替换了:
10*i<j?i:j 中如果不带括号的话,则乘法的优先级比较高,,所以先计算10*i即100;100<15不成立,所以输出j,即结果为15
宏不是函数,宏展开就是相当于套公式
展开之后就是
10 * MIN(i,j)
= 10 * (10)>(15)?(10):(15);
= 100 > 15?10:15
因为100 大于15,所以结果就是10了