我的代码:
#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);
至:
j=PRODUCT(i+1);
它扩展为i+1*i+1
,即i+i+1
,即7
。我认为这不是预期的结果,将来还会在您的问题中加入。
您的宏不正确。下面的表达式:
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++) )
它调用未定义的行为,因为此表达式缺少两个增量之间的序列点。