函数...(二)

简介: 函数的`return`语句用于结束函数执行并返回结果。它可以带一个表达式或不带,带表达式时会先计算表达式再返回其值,不带时适用于`void`类型的函数。如果返回值与函数声明的返回类型不符,系统会自动转换。确保所有分支都有`return`,避免编译错误。函数是否需要返回值取决于实际需求。数组可作为参数传递,但函数调用不能嵌套定义,却能链式调用,即一个函数的返回值作为另一个函数的参数。函数需先声明后使用,尤其在多文件项目中,声明通常在头文件,实现则在源文件中。

函数...+https://developer.aliyun.com/article/1519813?spm=a2c6h.13148508.setting.14.5a334f0eK8TFUt


四、return语句


1.在函数的设计中,函数中经常会出现return语句,这里讲一下return语句使用的注意事项。


2.return后边可以是一个数值, 也可以是一个表达式,如果是表达式则先执行表达式, 再返回表达式的结果。


3.return后边也可以什么都没有,直接写 return;这种写法适合函数返回类型是void的情况。


4.return返回的值和函数返回类型不一致,系统会自动将返回的值隐式转换为函数的返回类型。


5.return语句执行后,函数就彻底返回,后边的代码不再执行。


6.如果函数中存在if等分支的语句,则要保证每种情况下都有return返回,否则会出现编译错误。


 例:写一个函数打印1-n的数字



结果为:



因为打印1-n的数字不需要返回值,所以函数的返回类型写成void


再如:


 

结果为:



时return返回的值和函数返回类型不一致,系统自动将返回的值隐式转换为函数的返回类型。

 

再如:


结果为:



因为只讨论了n为奇数时的情况,缺少了n为偶数的情况,情况考虑不周,则出现错误


如果函数中存在if等分支的语句,则要保证每种情况下都有return返回,否则会出现编译错误。


函数需不需要返回值,是根据实际情况设计的


五、数组做函数参数


在使用函数解决问题的时候,难免会将数组作为参数传递给函数,在函数内部对数组进行操作

 

1.实参和形参的名字可以相同


2. 数组传参写的是数字名


3. 形参写的也是数组的形式,并且在形参书写的时候可以省略元素个数(针对一维数组)


4. 数组传参后,形式的数组和实参的数组是同一块空间,改变形参的数组就是在修改实参数组


如:写一个函数将一个整型数组的内容全部置为-1,再写一个函数打印数组的内容



结果为:



这里我们需要知道数组传参的几个重点知识:


1.函数的形式参数要和函数的实参个数匹配


2.函数的实参是数组,形参也是可以写成数组形式的


3.形参如果是一维数组,数组大小可以省略不写


4.形参如果是二维数组,行可以省略,但是列不能省略


5.数组传参,形参是不会创建新的数组的


6.形参操作的数组和实参的数组是同一个数组


六、嵌套调用


嵌套调用就是函数之间的互相调用,每个函数就像一个乐高零件, 正是因为多个乐高的零件互相无缝的配合才能搭建出精美的乐高玩具,也正是因为函数之间有效的互相调用, 最后写出来了相对大型的程序。


如:计算某年某月有多少天


如果要函数实现,可以设计2个函数:


is_leap_year():根据年份确定是否是闰年


get_days_of_month():调用is_leap_year确定是否是闰年后,再根据月计算这个月的天数



结果为:



这一段代码,完成了一个独立的功能。代码中反应了不少的函数调用:


main函数调用了 scanf、printf、get_days_of_month


get_days_of_month 函数调用 了is_leap_year


未来的稍微大一些代码都是函数之间的嵌套调用,但是函数是不能嵌套定义的。


七、链式访问


所谓链式访问就是将一个函数的返回值作为另外一个函数的参数,像链条一样将函数串起来就是函数的链式访问


如:


结果为:


这里直接把strlen的返回值作为printf函数的参数


再如:



结果为:



再如:



结果为:



八、函数的声明和定义


单个文件


一般我们在使用函数的时候,直接将函数写出来就使用了


比如:我们写一个函数判断是否为闰年



结果为:



橙色的部分为函数的定义,绿色的部分为函数的调用


C语言中要求函数必须先声明后使用!



如果把函数声明写在后面,虽然可以运行,但是会出现这种情况


这是因为C语言编译器对源代码进行编译的时候,从第一行往下扫描的,当is_leap_year函数调用的时候,并没有发现前面有is_leap_year的定义,就报出了上述的警告。


把怎么解决这个问题呢?


就是函数调用之前先声明一下is_leap_year这个函数,声明函数只要交代清楚:函数名,函数的返回类型和函数的参数。


如: int is_leap_year(int y); 这就是函数声明,函数声明中参数只保留类型,省略掉名字也是可以的。


多个文件


一般在企业中写代码时候,代码可能比较多,不会将所有的代码都放在一个文件中;我们往往会根据程序的功能,将代码拆分放在多个文件中。


一般情况下,函数的声明、类型的声明放在头文件(. h) 中,函数的实现是放在源文件(. c) 文件中。



分模块写代码的好处:


1.逻辑清晰


2.方便协作


3.方便代码的隐藏

 

目录
相关文章
|
SQL Oracle 关系型数据库
关系型数据库Oracle并行查询
【7月更文挑战第12天】
401 15
|
芯片
连串口通信都懂的网工,绝对不一般!
连串口通信都懂的网工,绝对不一般!
432 0
|
缓存 安全 开发工具
一个很好用的Flutter SDK版本管理神器fvm
一个很好用的Flutter SDK版本管理神器fvm
一个很好用的Flutter SDK版本管理神器fvm
|
运维 安全 网络安全
电商如何选择合适且稳定的服务器
综上,选择合适且稳定的服务器不仅要考虑硬件和软件的性能,还需要考虑服务商的服务质量和价格等因素。
207 0
|
存储 物联网 程序员
C语言与硬件交互
C语言因其低级别特性和高性能在系统编程和硬件交互中广泛应用。它提供内存操作和底层指令调用来直接控制硬件,尤其是在嵌入式系统、操作系统内核和驱动开发中。通过指针操作内存地址实现硬件寄存器的读写,或使用内联汇编调用底层指令,但要注意权限、内存映射、并发问题和硬件差异。文中还给出了简单的读写硬件状态和控制设备的C语言代码示例。在高级应用中,C语言用于编写驱动程序和实时操作系统,是底层开发的关键技能。
|
运维 安全 网络安全
数据资产目录建设之数据分类全解(下)
数据资产目录建设之数据分类全解(下)
|
机器学习/深度学习 文字识别 自然语言处理
开启智能时代:深度解析智能文档分析技术的前沿与应用
开启智能时代:深度解析智能文档分析技术的前沿与应用
开启智能时代:深度解析智能文档分析技术的前沿与应用
|
SQL 安全 关系型数据库
|
存储 数据建模 双11
《全链路数据治理-智能数据建模 》——数仓建模理论与规范(7)
《全链路数据治理-智能数据建模 》——数仓建模理论与规范(7)
468 0
|
机器学习/深度学习 算法 JavaScript
去中心化交易所套利机器人模型建立及开发源码示例
去中心化交易所套利机器人是一种用于从去中心化交易所中套利的机器人。这些机器人通过监测市场价格变动、执行交易操作并快速获利,为套利者提供了一种高效的投资策略。 套利机器人的工作原理是通过分析市场数据,预测价格涨跌趋势,并在价格出现异常时迅速进行交易,从而实现套利收益。套利机器人通常使用高速计算机和复杂的算法来捕捉市场中的套利机会,以最大化收益并减少风险。