C中的宏和前/后增量

时间:2016-12-14 17:30:08

标签: c macros post-increment pre-increment

在使用预增量运算符时,我注意到宏函数的这种奇怪行为。我知道使用带有宏的预增量运算符是不可取的,但我仍然想知道执行以下2个代码背后的原因:

#include <stdio.h>

#define SQR(x) {x*x }

int main()
{
    int a=4;
    int b=SQR(a++);
    int c=SQR(++a);
    printf("%d.....%d....%d\n",b,c,a*b*c); 
    return 0;
}

这个输出是:

20.....64....10240

第一个值b是20,这是好的4 * 5。但是为什么C的值是64,即8 * 8而不是7 * 8?

我刚刚更换了这样的执行顺序:

#include <stdio.h>

#define SQR(x) {x*x }

int main()
{
    int a=4;
    int c=SQR(++a);
    int b=SQR(a++);
    printf("%d.....%d....%d\n",b,c,a*b*c); 
    return 0;
}

这个输出是:

42.....36....12096

奇怪的不是吗?预增量再次出现了一些问题。它给出了42,即6 * 7而不是5 * 6,之后,增量也给出了错误的答案36,即6 * 6而不是6 * 7.

如果有人能解释为什么输出是这样的话会有很大帮助吗?

1 个答案:

答案 0 :(得分:2)

MACRO是文本替代品,因此您的代码

 SQR(a++)

扩展为类似

 a++ * a++

int c=SQR(++a);int c = ++a*++a;

调用undefined behavior。要详细说明为什么部分,请参考这个写得很好的答案。