在使用预增量运算符时,我注意到宏函数的这种奇怪行为。我知道使用带有宏的预增量运算符是不可取的,但我仍然想知道执行以下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.
如果有人能解释为什么输出是这样的话会有很大帮助吗?
答案 0 :(得分:2)
MACRO是文本替代品,因此您的代码
SQR(a++)
扩展为类似
a++ * a++
和int c=SQR(++a);
到int c = ++a*++a;
调用undefined behavior。要详细说明为什么部分,请参考这个写得很好的答案。