输出是如何从这个C代码产生的?

时间:2017-12-14 00:26:15

标签: c output

这是以前的考试中的一个问题,我似乎无法弄清楚我们如何从这段代码中获得输出。我理解如何获得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

2 个答案:

答案 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)

  1. 当值被“替换”到宏中时,不会首先评估该值。

    即。 printf(“%d”,a + b + 1 * b + 1);

  2. 这个更直接,它将参数p替换为字符串文字。

    即。 printf(“%d \ n”,a);