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

pri*_*lik 1 c macros preprocessor output

我的代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

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

7 7 12 49. 
Run Code Online (Sandbox Code Playgroud)

宏中是否有任何错误或其他问题?

ana*_*ciu 6

您的代码具有未定义的行为,操作在i

k=PRODUCT(i++);
l=PRODUCT(++i);
Run Code Online (Sandbox Code Playgroud)

缺少一个序列点

至于:

j=PRODUCT(i+1);
Run Code Online (Sandbox Code Playgroud)

它扩展到i+1*i+1which is i+i+1which is 7。我认为这不是预期的结果,将来也会将其包含在您的问题中。


cig*_*ien 5

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

PRODUCT(i+1)
Run Code Online (Sandbox Code Playgroud)

将扩展到

(i+1 * i+1)
Run Code Online (Sandbox Code Playgroud)

这是2*i+1.

你的宏应该是:

#define PRODUCT(x) ((x)*(x))
Run Code Online (Sandbox Code Playgroud)

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

int product(int x)
{
  return x * x;
}
Run Code Online (Sandbox Code Playgroud)

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

PRODUCT(i++)
Run Code Online (Sandbox Code Playgroud)

你会得到

( (i++) * (i++) )
Run Code Online (Sandbox Code Playgroud)

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