在使用宏的表达式中出现了意外的输出[重复]。

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

你的宏不正确。下面的表达式。

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

的行为,因为这个表达式在两个增量之间缺少一个序列点。


6
投票

您的代码有未定义的行为,在 i:

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

缺少一个序列点.

至于。

j=PRODUCT(i+1);

它扩大到 i+1*i+1 也就是 i+i+1 也就是 7. 我想这应该不是预期的结果吧,以后在你的问题中也要包括这一点。

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