函数...+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.方便代码的隐藏