漫谈:C语言 C++ 函数返回值究竟是什么

        函数的返回值经常很令人困惑,有些函数有返回值,有些函数没有返回值,有返回值的函数也可以没有return语句而正常运行。

        比如这样的代码一般是可以编译的,执行也正常:

int f(int a)
{printf("%d\n",a);
}
int main()
{f(5);
}

        很奇怪是吗?

        搞懂返回值究竟是什么就不奇怪了。

        所有的CPU,处理函数的返回值都是这样的逻辑:

  • 返回值放在一个寄存器里,一般是累加器
  • 返回到调用处继续执行

        return语句就是同时做了上面两件事。

        那么没有return语句会怎么样?执行到函数结束一样会返回调用处继续执行。

        虽然没有设置返回值,但CPU的寄存器还在啊,总是可以访问的(虽然值不是预期)。

        累加器的值或许刚好是最后一个表达式的计算结果,刚好是期待的返回值,但更可能的是一个非预期的值,造成BUG。如果代码本身其实用不到返回值,不设置返回值当然没什么问题,但是为什么要声明为有返回值呢?

        怀疑早期的程序员写程序很随意,胡写,所以C语言没法强制return。也或许是早期编译器没有智能到检查出没有返回值得代码分支,毕竟,在很多嵌套的if else里面识别出哪些是函数结束是很困难的。

        但是不管怎么说,声明有返回值的函数没有正确设置返回值都是BUG,还好现代编译器都能给出警告。目前VS2022对一个return都没有作为错误,而没有return的分支只作为警告。

        因为函数返回值放在寄存器里,是没法取地址的,是个“右值”。

        如果函数返回值是个对象,寄存器放不下,那么编译器就会生成很复杂的代码来处理。一般建议不要返回对象,尽量通过指针参数来实现。

(这里是结束)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/88267.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

负载均衡器监控

什么是负载均衡器 负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企…

[React] 自定义hooks设计模式

文章目录 1.自定义hooks设计1.1 自定义hooks1.2 设计一个自定义hooks1.3 自定义hooks的驱动条件1.4 自定义hooks的通用模式1.5 自定义hooks的条件限定 1.自定义hooks设计 react-hooks是react16.8以后,react新增的钩子API,目的是增加代码的可复用性&…

小程序为什么必须使用SSL证书?

随着互联网技术的发展,越来越多的网站和应用程序开始使用SSL证书来保护用户数据的安全。微信小程序作为一款广受欢迎的应用程序,也必须使用SSL证书来确保用户数据的安全。 首先,使用SSL证书可以保护用户数据的安全。SSL证书是一种数字证书&am…

rust特性

特性,也叫特质,英文是trait。 trait是一种特殊的类型,用于抽象某些方法。trait类似于其他编程语言中的接口,但又有所不同。 trait定义了一组方法,其他类型可以各自实现这个trait的方法,从而形成多态。 一、…

玩转Mysql系列 - 第22篇:mysql索引原理详解

这是Mysql系列第22篇。 背景 使用mysql最多的就是查询,我们迫切的希望mysql能查询的更快一些,我们经常用到的查询有: 按照id查询唯一一条记录 按照某些个字段查询对应的记录 查找某个范围的所有记录(between and) …

学GoWorld,go 1.21

win11,下载go安装包运行, 环境变量GOPATHd:\go_work d:\go_work路径下执行 go install github.com/xiaonanln/goworldlatest 就自动下载了很多文件 进入D:\go_work\pkg\mod\github.com\xiaonanln\goworldv0.1.6 mod init goworld replace github.…

5+单细胞+脂质代谢+预后模型+实验

今天给同学们分享一篇5单细胞脂质代谢预后模型实验的生信文章“Single-cell transcriptome analysis reveals the metabolic changes and the prognostic value of malignant hepatocyte subpopulations and predict new therapeutic agents for hepatocellular carcinoma”&am…

uniapp ui安装 阿里图标库使用 报错 Assignment to constant variable.

安装 ui uni-app官网 (dcloud.net.cn) (一)安装 pages.js配置 安装 sassnpm i sass -D 或 yarn add sass -D 安装 sass-loader npm i sass-loader10.1.1 -D 或 yarn add sass-loader10.1.1 -D安装 uni-uinpm i dcloudio/uni-ui 或 yarn a…

基于若依ruoyi-nbcio增加flowable流程待办消息的提醒,并提供右上角的红字数字提醒(四)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 上一节说到待办系统的监听器TaskCreateListener,需要在flowable全局监听配置里加入配置 1、Glo…

【开发篇】八、SpringBoot整合MongoBD

文章目录 1、整合2、简单示例3、一点思考4、MongoDB的安装5、MongoDB的CRUD语法 1、整合 导入MongoBD的起步依赖:(这个starter背后是MongoDB的驱动和其他依赖,在这儿也可以看出命名的规律,redis的就是spring-boot-starter-data-r…

(Mysql高级语句(进阶查询语句+数据库函数+连接查询))

Mysql高级语句(进阶查询语句MySQL数据库函数连接查询) 一、mysql查询语句1.1、 select ----显示表格中一个或数个字段的所有数据记录1.2、 distinct ----不显示重复的数据记录1.3、where ----有条件查询1.4、 and or ----且 或1.5 、in----显示已知的值的…

oracle 比 mysql 查询快的原因_Oracle 查询速度慢的原因总结

目录 1. oracle 比 mysql 查询快的原因_Oracle 查询速度慢的原因总结 1. oracle 比 mysql 查询快的原因_Oracle 查询速度慢的原因总结 查询速度慢的原因很多, 常见如下几种: 没有索引或者没有用到索引(这是查询慢最常见的问题, 是程序设计的缺陷)I/O 吞吐量小, 形成了瓶颈效应…

算法竞赛备赛之动态规划训练提升,DP基础掌握

1.背包问题 1.1.01背包问题 01背包问题是在M件物品中选择若干件放在空间为W的背包中,每件物品的体积为W1,W2至Wn,价值为P1,P2至Pn,01背包的约束条件是给定几种物品,每种物品有且只有一个,并且…

ansible的个人笔记使用记录

1.shell模块使用,shell模块------执行命令,支持特殊符 ansible all -m shell -a yum -y install nginx ansible all -m shell -a systemctl restart nginx ansible all -m shell -a systemctl stop nginx && yum -y remove nginx2. file模块…

【JS | MD5】使用crypto模块实现md5加密功能(解决中文加密前后端不一致的问题)

正常情况下使用md5加密 var crypto require(crypto);var md5Sign function (data) {var md5 crypto.createHash(md5).update(data).digest(hex);return md5; } 实际开发中经常需要前端nodejs调用后端java接口,使用上述方法会出现中文加密结果不同的情况&#x…

ChatGPT重磅升级:可以看图、听声音、说话啦!

美东时间9月25日,OpenAI在官网宣布,对ChatGPT进行重磅升级实现看图、听声音、输出语音内容三大功能。 早在今年3月OpenAI发布GPT-4模型时,就展示过看图的功能,但由于安全、功能不完善等原因一直没有开放。现在不仅开放了看图&…

TensorFlow入门(四、数据流向机制)

session与"图"工作过程中存在的两种数据的流向机制,即:注入机制和取回机制 注入机制(feed):即通过占位符向模式中传入数据 取回机制(fetch):指在执行计算图时,可以同时获取多个操作节点的计算结果 实例代码如下: import tensorflow.compat.v1 as tftf…

Redis 支持哪些数据类型?以及使用场景?

五种常用的基础数据类型:String,List,Set,ZSet,Hash 基于基础数据类型实现的高级数据类型:BitMap,HyperLogLog,GEO,Stream String 类型的应用场景:缓存对象、…

傅一平:2023年我的私人书单(上)

2023年一直在通过ChatGPT学习,读书少了,但不能不读。 这里推荐上半年读过的TOP 9 书单,同时附上我的一句话评语和豆瓣的评分,涉及思考方法、系统架构、跨学科知识、沟通技巧、生活感悟、个人修养等等。 TOP 1 佛畏系统-用系统思维…

解决apscheduler意外跳过任务【Execution of job “xx“(trigger:xxx), next run at: xxx】

解决方法 添加配置: max_instances:添加最多可同时进行的数量 misfire_grace_time:如果意外断开,多少秒以内会重新尝试运行 如: scheduler.add_job(print_each_5_second, interval, seconds5, max_instances10, mi…