如何理解这个C宏?

高塔姆·阿鲁纳查拉姆

我无法理解此代码

#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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章