这是以前的考试中的一个问题,我似乎无法弄清楚我们如何从这段代码中获得输出。我理解如何获得5,但似乎难以解决接下来的两位数。
#include <stdio.h>
#define FIRST(x,y) x + y*y
#define SECOND(p,q) printf("%" #p "\n", q)
int main(void) {
int a = 1, b = 2;
printf("%d", FIRST(a,b));
printf("%d", FIRST(a,b+1));
SECOND(d,a);
return 0;
}
输出:
561
答案 0 :(得分:2)
printf("%d", FIRST(a,b));
:FIRST(a,b)
扩展为a + b*b
。评估时,1 + 2 * 2 = 5.这将打印5。
printf("%d", FIRST(a,b+1));
:FIRST(a,b+1)
扩展为a + b+1*b+1
。评估时,1 + 2 + 1 * 2 + 1 = 6.打印6。
SECOND(d,a);
扩展为printf("%" "d" "\n", a);
1 这会打印1和换行符。
1 宏中的#p
表示“实际参数的文字文本,转换为字符串常量”。请参阅Stringizing。
答案 1 :(得分:1)
当值被“替换”到宏中时,不会首先评估该值。
即。 printf(“%d”,a + b + 1 * b + 1);
这个更直接,它将参数p替换为字符串文字。
即。 printf(“%d \ n”,a);