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。要详细说明 为什么 部分,请参阅这个写得很好的答案。
我注意到宏函数在使用预增量运算符时有这种奇怪的行为。我知道对宏使用预增量运算符并不可取,但我仍然想知道执行以下 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。要详细说明 为什么 部分,请参阅这个写得很好的答案。