我已经注意到使用预增加运算符时宏函数的这种奇怪的行为。我知道这是不是最好使用预增运算符与宏,但我仍想知道以下两个代码的执行背后的原因:C中的宏和前/后增量
#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。
如果有人能解释为什么输出是这样的话,这将是一个很大的帮助?
未定义的行为 – Danh
这不是一个很重复的http://stackoverflow.com/questions/949433/why-are-these-constructs-using-undefined-behavior因为OP可能会混淆宏是什么(假设Sourav Ghosh的回答)。 –
嗨@Danh居然在我的一次考试中提出了这个问题,因此我认为应该有一些方法来得到答案。 – user7297996