如何理解这个C宏?

时间:2018-11-08 01:29:44

标签: c c-preprocessor

我无法理解此代码

#define sqt(x) x*x
int main(){
print("%d",sqt(3+1));
}

手动获得10的输出,但是在编写代码并进行编译时,得到的答案为7。请解释一下。

1 个答案:

答案 0 :(得分:9)

请记住,由于您使用的是宏,因此在调用3 + 1之前不会评估sqtx变成3 + 1(而不是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