我试图了解函数和带有参数的宏之间的区别(又名“宏函数”?),我得到了这个代码:
#include <stdio.h>
#define mult_m(a) a*a
int mult_f(int a){
return a*a;
}
int main()
{
int x=3,y=3,z=3;
//printf("%d\n",mult_m(x++));
//printf("%d\n",mult_f(++y));
printf("%d\n",++z * z++);
printf("%d\n",z);
return 0;
}
输出为:20
我知道优先级和关联性,这个输出对我来说没有意义,在我的头脑中这应该是:
后缀增量的优先级高于 * 或前缀 ++,因此: ++z * 3++ ---> ++z * 3(z 现在等于 4)---> ++4 * 3
* 和前缀 ++ 具有相同的优先级,因此结合性是从右到左的,因此: ++4 * 3 ---> 5*3=15
头炮输出:15
实际产量:20
你能解释一下为什么会发生这种情况吗?如果您有 C 标准参考来解释这一点,我将非常感激
提前致谢!
你能解释一下为什么会发生这种情况吗?
是的,因为当您对变量进行无序修改时,它会调用未定义的行为
z
。
如果您启用警告,编译器会警告您
<source>:23:19: warning: operation on 'z' may be undefined [-Wsequence-point]