我无法理解此代码
#define sqt(x) x*x
int main(){
print("%d",sqt(3+1));
}
手动我得到 10 的输出。但是当编写代码并编译它时,我得到的答案是 7。请解释一下。
请记住,由于您使用的是宏,3 + 1
因此在sqt
调用之前不会对其进行评估。x
变为3 + 1
(not 4
),则运算顺序会导致产生意外的答案,因为加法发生在乘法之后。
或者换句话说:
sqt(3 + 1)
扩展为:
3 + 1 * 3 + 1
然后,当您像评估任何其他等式一样评估它时:
3 + 1 * 3 + 1 // Multiplication happens first
= 3 + 3 + 1
= 7
这是一个很好的例子,说明为什么除非绝对必要,否则不应使用宏,或者您已采取适当措施确保不会发生诸如操作顺序错误之类的事情。正如@Barmar 指出的那样,可以通过让宏扩展以包含显式括号来纠正这种特殊情况:
#define sqt(x) ((x)*(x))
这会导致评估不同并给出正确答案:
(3 + 1) * (3 + 1)
4 * 4
16
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句