使用宏的表达式中的意外输出

Unexpected output in expression that uses macros

我的代码:

#include <stdio.h>
#define PRODUCT(x) (x * x)

int main()
{
    int i = 3, j, k, l;
    j = PRODUCT(i + 1);
    k = PRODUCT(i++);
    l = PRODUCT(++i);
    printf("%d %d %d %d", i, j, k, l);
    return 0;
}

我无法理解为什么输出是:

7 7 12 49. 

宏有没有错误或者其他问题?

您的代码有未定义的行为,i 中的操作:

k=PRODUCT(i++);
l=PRODUCT(++i);

lack a sequence point.

至于:

j=PRODUCT(i+1);

它扩展为 i+1*i+1i+i+17。我认为这不是预期的结果,以后也将其包含在您的问题中。

您的宏不正确。以下表达式:

PRODUCT(i+1)

将扩展到

(i+1 * i+1)

2*i+1

您的宏应该是:

#define PRODUCT(x) ((x)*(x))

我强烈建议您停止为此类事情使用宏。你可以很容易地将它写成一个函数:

int product(int x)
{
  return x * x;
}

请注意,这仅适用于我给出的示例。如果你尝试

PRODUCT(i++)

你会得到

( (i++) * (i++) )

这会调用未定义的行为,因为此表达式在 2 个增量之间缺少序列点。