[英]Output of this program is 64. Can someone explain how?
#define sqr(a) a*a
int main()
{
int i;
i = 64 / sqr(4); //answer of this expression is 64.
printf("%d", i);
return 0;
}
在此代码中 output 为 64,根据规则,表达式i = 64 / sqr(4)
应解为i = 64 / 4*4
,结果为 4,但程序的 output 为64. 为什么?
宏不像函数一样被评估,它们被扩展到位。 该声明
i = 64 / sqr(4);
扩展到
i = 64 / 4*4;
乘法和除法运算符具有相同的优先级并且是左结合的,所以上面的语句被解析为
i = (64 / 4) * 4;
因此,您将64 / 4
的结果乘以4
,而不是将64
除以4 * 4
的结果。
他们避免像这样的宏的优先级和关联性问题的方法是将扩展括在括号中:
#define sqr(a) (a * a)
但是,这本身还不够——如果您执行类似sqr(1+2)
的操作,它将扩展为(1+2*1+2)
,其计算结果为5
而不是预期的9
。 您还需要用括号括住参数以及整个表达式:
#define sqr(a) ((a) * (a))
现在您的陈述扩展为
i = 64 / ((4) * (4));
并将根据您的期望进行评估。
您需要查看操作的顺序。 乘法首先完成,所以它的意思是(64 * 4) / 4
。 这是一个更新版本,在您的宏周围带有括号:
#define sqr(a) ((a)*(a))
int main()
{
int i;
i = 64 / sqr(4); //answer of this expression is 4.
printf("%d", i);
return 0;
}
我会尽量保持这个答案简单:
宏是一组在编译时被替换的代码。
现在,如果你用4*4替换sqr(4)
它变成了这样的东西: 64/4*4 。
现在,如果你应用 BODMAS 的基本规则。 它按如下方式执行:
64/4= 16
16*4= 64
即先除以 4,然后乘以 4,得到 64
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.