怎么理解这个C宏呢?
How to understand this C macro?
我无法理解这段代码
#define sqt(x) x*x
int main(){
print("%d",sqt(3+1));
}
我手动得到 10 的输出。但是当编写代码并编译它时,我得到的答案是 7。请解释一下。
请记住,由于您使用的是宏,因此在调用 sqt
之前不会计算 3 + 1
。 x
变为 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
我无法理解这段代码
#define sqt(x) x*x
int main(){
print("%d",sqt(3+1));
}
我手动得到 10 的输出。但是当编写代码并编译它时,我得到的答案是 7。请解释一下。
请记住,由于您使用的是宏,因此在调用 sqt
之前不会计算 3 + 1
。 x
变为 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