杂谈(4)-关于C语言的返回值返回到哪里

今天看到有人提问,C语言中return是return到哪里,感觉这个问题很有意思,故除了回答之外,顺便写篇文章(内容上是相同的)。


先说结论:
返回给逻辑上的主调方。如果指的是返回到寄存器还是哪个主存单元,则答案是不能确定,取决于具体情况(主要是编译器具体策略)。
“逻辑中的主调方”并非专有名词。但要明白一点:主调方caller和被调方callee都只是逻辑上的控制流程, 不一定真正形成子流程结构

C语言中的控制流和函数

C中的函数被编译为中间代码,再从中间代码生成机器的目标码。这个过程相当复杂,具体涉及编译原理,我们不展开叙述。从中间代码生成目标代码的过程与机器本身高度相关,我们按下不表,主要看生成中间代码的过程,这一部分才是涉及到控制流逻辑核心的部分。
控制流(Control Flow)可以理解为计算机中,程序从入口点(Entry)开始的程序执行流,顺序结构的控制流是一路向下不回头的,分支结构每次执行时控制流根据条件前往其中一个分支,循环结构可以将控制流导回之前的部分,流图表现为成环。C语言代码生成中间代码时,函数一般会形成符号(Symbol)(但有时不会。声明和定义通常都会产生符号),以及和符号对应的生成代码(只有定义会产生生成代码,声明则不会),写入符号表等表格。这也是C语言分单元编译链接的理论基础。
在典型的函数控制流中,一个典型的函数会被单独抽出来:

int foo(int a) {
   
    // 假定a通过AX传入
  return calc(a); // 假定calc是一个通过AX寄存器传参的外部函数
  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值