使用宏的表达式中的意外输出
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+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++) )
这会调用未定义的行为,因为此表达式在 2 个增量之间缺少序列点。
我的代码:
#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+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++) )
这会调用未定义的行为,因为此表达式在 2 个增量之间缺少序列点。