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)
宏中是否有任何错误或其他问题?
您的代码具有未定义的行为,操作在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。我认为这不是预期的结果,将来也会将其包含在您的问题中。
你的宏不正确。以下表达式:
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 个增量之间缺少序列点。