【C语言】函数的系统化精讲(一)1:https://developer.aliyun.com/article/1474640
2.3 return 语句
在函数的设计中,函数中经常会出现return语句,这⾥讲⼀下return语句使⽤的注意事项。
• return后边可以是⼀个数值,也可以是⼀个表达式,如果是表达式则先执⾏表达式,再返回表达式的结果。
int Add(int x, int y) { return x+y; }
return后边也可以什么都没有,直接写 return; 这种写法适合函数返回类型是void的情况。
void print() { int a = 0; scanf("%d", &a); if (a > 5) { printf("今天你吃了没\n"); return;//直接跳出,不执行后面的语句 } printf("没吃\n"); } int main() { print(); return 0; }
• return返回的值和函数返回类型不⼀致,系统会⾃动将返回的值隐式转换为函数的返回类型。
int test() { return 6.88; } int main() { int r = test(); printf("%d", r); return 0; }
• 如果函数中存在if等分⽀的语句,则要保证每种情况下都有return返回,否则会出现编译错误。
这个代码的结果不是三,而是未定义行为。原因是在add函数中,如果c的值不等于8,没有明确返回值,即没有return语句。这将导致在main函数中使用add函数的返回值时,得到的是未定义的值。所以结果无法确定,可能是任意的值。
==注:==虽然在add函数中没有明确的返回值,但是在实际运行时,根据编译器和操作系统的不同,程序可能会出现一些不同的行为。在你的编译器和操作系统下,可能出现了一种情况,即在add函数中,局部变量c的初始值恰好是3,所以在main函数中打印出来的值是3。但是这种情况并不是所有编译器和操作系统都会出现,所以这个程序的行为是未定义的。因此,不应该依赖这种行为,而应该在add函数中加上明确的返回语句。
三、嵌套调⽤和链式访问
3.1 嵌套调⽤
嵌套调⽤就是函数之间的互相调⽤,每个函数就⾏⼀个乐⾼零件,正是因为多个乐⾼的零件互相⽆缝的配合才能搭建出精美的乐⾼玩具,也正是因为函数之间有效的互相调⽤,最后写出来了相对⼤型的程序。
假设我们计算某年某⽉有多少天?,如果要函数实现,可以设计2个函数:
• is_leap_year()
:根据年份确定是否是闰年
• get_days_of_month()
:调⽤is_leap_year
确定是否是闰年后,再根据⽉计算这个⽉的天数
int is_leap_year(int y) { if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)) return 1; else return 0; } int get_days_of_month(int y, int m) { int days[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; int day = days[m]; if (is_leap_year(y) && m == 2) day += 1; return day; } int main() { int y = 0; int m = 0; scanf("%d %d", &y, &m); int d = get_days_of_month(y, m); printf("%d\n", d); return 0; }
这⼀段代码,完成了⼀个独⽴的功能。代码中反应了不少的函数调⽤:
• main 函数调⽤ scanf 、 printf get_days_of_month
• get_days_of_month 函数调⽤ is_leap_year
这⼀段代码,完成了⼀个独⽴的功能。代码中反应了不少的函数调⽤:
• main 函数调⽤ scanf 、 printf get_days_of_month
• get_days_of_month
函数调⽤ is_leap_year
3.2链式访问
链式访问是指将一个函数的返回值作为另一个函数的参数,将函数串起来形成函数链。
#include <stdio.h> int main() { int len = strlen("abcdef");//1.strlen求⼀个字符串的⻓度 printf("%d\n", len);//2.打印⻓度 return 0; }
那如果我连续访问呢?
在看⼀个有趣的代码,下⾯代码执⾏的结果是什么呢?
#include <stdio.h> int main() { printf("%d", printf("%d", printf("%d", 43))); return 0; }
这个代码的关键是明⽩ printf 函数的返回是啥?
printf
定义:
1 int printf ( const char * format, ... );
后面有三个点,说明他的返回的值不止一个。
printf函数返回的是打印在屏幕上的字符的个数。
上⾯的例⼦中,我们就第⼀个printf打印的是第⼆个printf的返回值,第⼆个printf打印的是第三个
printf的返回值。
第三个printf打印43,在屏幕上打印2个字符,再返回2
第⼆个printf打印2,在屏幕上打印1个字符,再放回1
第⼀个printf打印1
所以屏幕上最终打印:4321
—那如果我加多一个空格呢?
执⾏的结果又会是什么呢?
#include <stdio.h> int main() { printf("%d", printf("%d", printf("%d ", 43))); return 0; }
总结
本小节我们主要了解了库函数,⾃定义函数的使⽤⽅法,形参和实参和return 语句
还有我们的嵌套调⽤和链式访问。