使用预增量和后增量运算符时宏的奇怪结果

时间:2016-06-11 04:52:26

标签: c

我从此代码中获得1249

#include <stdio.h>
#define product(a) a*a

int main() {
    int i = 3, j, k;
    j = product(i++);
    k = product(++i);
    printf("%d %d\n", j, k);

    return 0;
}

如果不是使用宏而是使用一个函数,那么你得到9和25,这就是我所期望的......

有人能解释为什么会这样吗?

2 个答案:

答案 0 :(得分:1)

如果展开宏,则行

j = product(i++);

变为

j = i++*i++;

和行

k = product(++i);

变为

k = ++i*++i;

这两行都有未定义的行为。您可以尝试在程序的一次运行中理解它,但不能保证结果与不同的编译器或甚至具有不同编译器标志的相同编译器相同。

当您使用函数调用而不是宏时,代码的行为更直接。这条线

j = product(i++);

相当于:

int temp = i;
j = product(temp);
i++;

该行

k = product(++i);

相当于:

++i;
k = product(i);

因此,使用函数而不是宏时没有问题。

答案 1 :(得分:0)

您期望的输出将要求您将宏更改为函数

#include <stdio.h>
int product(int a) { return a * a; }

int main() {
    int i = 3, j, k;
    j = product(i++);
    k = product(++i);
    printf("%d %d\n", j, k);

    return 0;
}

<强>输出

9 25

由于宏解压缩内联,i函数的callframe中main的值会发生变化,您会得到意外的结果。