C 中的宏和 Pre/Post 增量

Macro and Pre/Post Increment in C

我注意到宏函数在使用预增量运算符时有这种奇怪的行为。我知道对宏使用预增量运算符并不可取,但我仍然想知道执行以下 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,之后 post 增量也给出了错误答案 36,即 6*6 而不是 6*7。

如果有人能解释为什么输出是这样的,那将是一个很大的帮助?

宏是文本替换,因此您的代码

 SQR(a++)

扩展为

 a++ * a++

并且,int c=SQR(++a);int c = ++a*++a;

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