首页 > 解决方案 > Problems with #define in c

问题描述

#include <stdio.h>

#define M(x) x - x

int main () {
    printf ("%d %d\n",M(M (1+2)) , M(M (3)));
    return 0;
}

Can someone explain to me step by step how the result to this is 6 -6?

标签: cc-preprocessor

解决方案


为了理解正在发生的事情,必须清楚的是,当宏被解析时,它只是一个替换,而不是一个计算。

例如

M(1+2)

被替换为

1 + 2 - 1 + 2
^     ^ ^
x     - x

重要的是要观察到减号不适用于完整的表达式。所以在这种情况下,结果将是4

让我们分析一下我们组合的宏:

/* First step */
M(M(1+2)                              M(M(3))
M(1 + 2 - 1 + 2)                      M(3 - 3)
  ^     ^ ^                             ^ ^ ^
  x     - x                             x - x

/* Second step */
M(1 + 2 - 1 + 2)                      M(3 - 3)
1 + 2 - 1 + 2 - 1 + 2 - 1 + 2         3 - 3 - 3 - 3
^             ^ ^                     ^     ^ ^
x             - x                     x     - x

这些奇怪的和被传递给最终简化它们的编译器。结果实际上是6(左侧)和-6(右侧)。


我猜这个结果让您感到困惑,因为使用 definex-x时,您希望 x 的每个值都得到 0。正如我向您展示的那样,您没有得到它的原因是减号仅适用于第一个加数。为了获得“始终为零的宏”,只需使用括号:

#define M(x) (x)-(x)

推荐阅读