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

问题描述 投票:1回答: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. 

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

c macros output preprocessor
2个回答
5
投票

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

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

lack a sequence point

至:

j=PRODUCT(i+1);

它扩展为i+1*i+1,即i+i+1,即7。我认为这不是预期的结果,将来还会在您的问题中加入。


4
投票

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

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++) )

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

© www.soinside.com 2019 - 2024. All rights reserved.