<分区>
在最近的一次采访中,有人向我提供了这段 C 代码的变体,并询问该函数将返回什么。
#define fun(a) a*a
int main() {
return(fun(4+5));
}
我用 printf("%d"...)
来代替返回并打印 29。除了 "%d"之外没有其他类型显示结果。有人可以解释这里发生了什么吗?
标签 c
<分区>
在最近的一次采访中,有人向我提供了这段 C 代码的变体,并询问该函数将返回什么。
#define fun(a) a*a
int main() {
return(fun(4+5));
}
我用 printf("%d"...)
来代替返回并打印 29。除了 "%d"之外没有其他类型显示结果。有人可以解释这里发生了什么吗?
最佳答案
a
被扩展,而不是被评估为 a
。所以你得到:
4+5*4+5
以及运营商的优先级;你得到 4 + 20 + 5 => 29
更好的方法(感谢 Thomas 的评论,使用额外的外括号来防止外部运算符):
#define fun(a) ((a)*(a))
但是世界上所有的括号仍然不能防止 i++
,函数调用(最好有副作用)...所以在宏中重用参数总是一个问题(没有语法可以声明并分配一个临时变量)。在这种情况下更喜欢内联函数。
关于c - 这段 C 代码中发生了什么? (来自采访),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42541987/