就这个题目而言,基本功稍微有些不扎实。要是说题主能力不够那自然是不公平的,但是这里体现出来的是宏定义和函数定义的概念模糊导致的。
如果M是个函数,那它就会是m,因为书写规范一般规定宏用大写,函数用小写。
宏的根本在于,完全替代。打个比方,有个人叫“张奥斯特洛夫斯基没卡普里奥”,但是太长了领导记不住,就喊“小张”,“小张”就宏定义了后面的一长串。后面凡是提到“小张”,就是“张奥斯特洛夫斯基没卡普里奥”,这时候程序突然写了一条:
请调取“小张”的第二个字;那你答案写“张”就错了,而是要写“奥”,因为宏定义是在预处理阶段就被替换掉的。换句话说,这段代码在预处理阶段就被处理成了:
请调取“张奥斯特洛夫斯基没卡普里奥”的第二个字;对应到这道题
# define M(a,b) (a)>(b)?(a):(b)
int main()
{
int i=10,j=15;printf("%d\n", 10*M(i,j));
return 0;
}预处理结束后就变成了:
int main()
{
int i=10,j=15;printf("%d\n", 10*(i)>(j)?(i):(j);
printf("Hello World");
return 0;
}答案就选A,10 了。因为10*10,确实比15要大,因此,输出的是i。
可能这些地方自己写代码并不一定会用到,但是这种东西出来,很可能理解错别处借鉴来的代码。 |