函数...(二)

简介: 函数的`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.方便代码的隐藏

 

目录
相关文章
|
7月前
|
编译器 程序员 Serverless
函数...(一)
该内容介绍了C语言中的函数概念,包括库函数和自定义函数。库函数是预先定义并实现的函数,如`printf`和`scanf`,它们在不同的头文件中声明,使用时需要包含相应的头文件。自定义函数则是用户根据需求编写的函数,具有自己的函数名、参数和返回类型。函数通过形参和实参交互,实参是调用时传递的实际值,形参是函数定义中的占位符。
48 2
|
JavaScript 前端开发
特殊函数:匿名函数的两种应用(①回调函数②自调函数)
特殊函数:匿名函数的两种应用(①回调函数②自调函数)
139 0
特殊函数:匿名函数的两种应用(①回调函数②自调函数)
|
安全 编译器 C语言
gets_s()函数的参数太少,strcpy_s():形参和实参 2 的类型不同,等c函数在Visual Studio上出现的问题, get()函数和scanf()读取字符串的区别,栈的随机性
gets_s()函数的参数太少,strcpy_s():形参和实参 2 的类型不同,等c函数在Visual Studio上出现的问题, get()函数和scanf()读取字符串的区别,栈的随机性
gets_s()函数的参数太少,strcpy_s():形参和实参 2 的类型不同,等c函数在Visual Studio上出现的问题, get()函数和scanf()读取字符串的区别,栈的随机性
|
Java
用Java方法来打印从1到N的阶乘的和
用Java方法来打印从1到N的阶乘的和
188 0
用Java方法来打印从1到N的阶乘的和
VBA function函数
VBA function函数
117 2
render函数的妙用
render函数的妙用
182 0
functools:对callable对象的高位函数和操作(持续更新ing...)
functools是对已有的函数(callable对象)的进行操作,生成新的函数(callable对象)。本文介绍functools的函数和对象。 持续更新。
【Groovy】循环控制 ( Number 注入函数实现循环 | times 函数 | upto 函数 | downto 函数 | step 函数 | 闭包作为最后参数可写在外面 )(二)
【Groovy】循环控制 ( Number 注入函数实现循环 | times 函数 | upto 函数 | downto 函数 | step 函数 | 闭包作为最后参数可写在外面 )(二)
152 0
【Groovy】循环控制 ( Number 注入函数实现循环 | times 函数 | upto 函数 | downto 函数 | step 函数 | 闭包作为最后参数可写在外面 )(二)
【Groovy】循环控制 ( Number 注入函数实现循环 | times 函数 | upto 函数 | downto 函数 | step 函数 | 闭包作为最后参数可写在外面 )(一)
【Groovy】循环控制 ( Number 注入函数实现循环 | times 函数 | upto 函数 | downto 函数 | step 函数 | 闭包作为最后参数可写在外面 )(一)
184 0