c - 这段 C 代码中发生了什么? (来自采访)

标签 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/

相关文章:

c - 在 Swift 中读取二进制 (.hgt) 文件(将代码从 C++ 迁移到 swift)

c - 关于C : Copying variables of user defined struct type的简单问题

C 忽略字节分配?

c - 如何将数组中的信息转换为字符串?在C中

c - 如何将 wchar_t 转换为 unicode 数字?

c - *** 检测到堆栈崩溃 ***//尝试打印一个字符

c - 我们如何检查我们的程序多线程是否在我们的程序中工作?

c - 在开关中分配结构不起作用

c - OpenCL。数组寻址/指针的奇怪错误

c - C 是否有使用 malloc 初始化结构并设置其字段的简写方法?