ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
【56.1 return深入讲解。】 return在英语单词中有“返回”的意思,上一节提到,凡是“有输出”的函数,函数内部必须有一个“return+变量或者常量”与之配套,表示返回的结果给外部调用者接收,这个知识点很容易理解,但是容易被忽略的是另外四个功能: 第一个是return语句隐含了立即退出的功能。退出哪?退出当前函数。只要执行到return语句,就马上退出当前函数。即使return语句身陷多层while或者for的循环中,它也毫不犹豫立即退出当前函数。 第二个是return语句可以出现在函数内的任何位置。可以出现在第一行代码,也可以出现在中间的某行代码,也可以出现在最后一行的代码,它的位置不受限制。很多初学者有个错觉,以为return只能出现在最后一行,这是错的。 第三个是return语句不仅仅可以用在“有输出”的函数,也可以用在“无输出”的函数,也就是可以用在前缀是void的函数里。回顾上一节,在“有输出”的函数里,return后面紧跟一个变量或者常量,表示返回的数,但是在“无输出”的函数里,因为是“无输出”,此时return后面不用跟任何变量或者常量,这种写法也是合法的,表示返回的是空的。此时return主要起到立即退出当前函数的作用。 第四个是return语句可以在一个函数里出现N多次,次数不受限制,不一定必须只能一次。不管一个函数内有多少个return语句,只要任何一个return语句被单片机执行到,就立即退出当前函数。 【56.2 中途立即退出的功能。】 下面的书写格式是合法的: void HanShu(void) //“无输出”函数的定义。 { 语句1; return; //立即退出当前函数。对于这类“无输出”函数,return后面没有跟任何变量或者常量。 语句2; return; //立即退出当前函数。对于这类“无输出”函数,return后面没有跟任何变量或者常量。 语句3; return; //立即退出当前函数。对于这类“无输出”函数,return后面没有跟任何变量或者常量。 } 分析:当HanShu此函数被调用时,单片机从“语句1”往下执行,当遇到第一个return语句后,马上退出当前函数。后面的“语句2”和“语句3”等代码永远不会被执行到。多说一句,大家仔细看看return后面跟了什么数没有?什么都没有。因为此函数的前缀是void的,是“无输出”的。 【56.3 身陷多层while或者for的循环时的惊人表现。】 下面的书写格式是合法的: void HanShu(void) //“无输出”函数的定义。 { 语句1; while(1) //第一个循环 { while(1) //第二个循环中的循环 { return; //立即退出当前函数。 } 语句2; return; //立即退出当前函数。 } 语句3; return; //立即退出当前函数。 } 分析:当HanShu此函数被调用时,单片机从“语句1”往下执行,先进入第一个循环,接着进入第二个循环中的循环,然后遇到第一个return语句,于是马上退出当前函数。后面的“语句2”和“语句3”等代码永远不会被执行到。此函数中,虽然表面看起来有那么多可怕的循环约束着,但是一旦碰上return语句都是浮云,立刻退出当前函数。 【56.4 在“有输出”函数里的书写格式。】 把上面例子中“无输出”改成“有输出”的函数后: unsigned char HanShu(void) //“有输出”函数的定义。 { unsigned char a=9; 语句1; while(1) //第一个循环 { while(1) //第二个循环中的循环 { return a; //返回a变量的值,并且立即退出当前函数。 } 语句2; return a; //返回a变量的值,并且立即退出当前函数。 } 语句3; return a; //返回a变量的值,并且立即退出当前函数。 } 分析:因为此函数是“有输出”的函数,所以return语句后面必须配套一个变量或者常量,此例子中配套的是a变量。当HanShu函数被调用时,单片机从“语句1”往下执行,先进入第一个循环,接着进入第二个循环中的循环,然后遇到第一个“return a”语句,马上退出当前函数。而后面的“语句2”和“语句3”等代码是永远不会被执行到的。再一次说明了,return语句不仅有返回某数的功能,还有立即退出的重要功能。 【56.5 项目中往往是跟if语句搭配使用。】 前面的例子只是为了解释return语句的执行顺序和功能,实际项目中,如果中间有多个return语句,中间的return语句不可能像前面的例子那样单独使用,它往往是跟if语句一起搭配使用,否则单独用return就没有什么意义。比如: void HanShu(void) //“无输出”函数的定义。 { 语句1; if(某条件满足) { return; //立即退出当前函数。 } 语句2; if(某条件满足) { return; //立即退出当前函数。 } 语句3; } 分析:单片机从“语句1”开始往下执行,至于在哪个“return”语句处退出当前函数,就要看哪个if的条件满不满足了,如果所有的if的条件都不满足,此函数会一直执行完最后的“语句3”才退出当前函数。 【56.6 例程练习和分析。】 写一个简单的除法函数,在除法运算中,除数不能为0,如果发现除数为0,就立即退出当前函数,并且返回运算结果默认为0。 /\*---C语言学习区域的开始。-----------------------------------------------\*/ //函数的声明。 unsigned int ChuFa(unsigned int BeiChuShu,unsigned int ChuShu); //变量的定义。 unsigned int a;//此变量用来接收除法的运算结果。 unsigned int b;//此变量用来接收除法的运算结果。 //函数的定义。 unsigned int ChuFa(unsigned int BeiChuShu,unsigned int ChuShu) { unsigned int Shang; //返回的除法运算结果:商。 if(0==ChuShu) //如果除数等于0,就立即退出当前函数,并返回0 { return 0; // 退出当前函数并且返回0.此时后面的代码不会被执行。 } Shang=BeiChuShu/ChuShu; //除法运算的算法 return Shang; //返回最后的运算结果:商。并且退出当前函数。 } void main() //主函数 { a=ChuFa(128,0); //函数调用。128除以0,把商返回给a变量。 b=ChuFa(128,2); //函数调用。128除以2,把商返回给b变量。 View(a); //把a发送到电脑端的串口助手软件上观察。 View(b); //把b发送到电脑端的串口助手软件上观察。 while(1) { } } /\*---C语言学习区域的结束。-----------------------------------------------\*/ 在电脑串口助手软件上观察到的程序执行现象如下: 开始... 第1个数 十进制:0 十六进制:0 二进制:0 第2个数 十进制:64 十六进制:40 二进制:1000000 分析: 变量a为0。 变量b为64。 【56.7 如何在单片机上练习本章节C语言程序?】 直接复制前面章节中第十一节的模板程序,练习代码时只需要更改“C语言学习区域”的代码就可以了,其它部分的代码不要动。编译后,把程序下载进带串口的51学习板,通过电脑端的串口助手软件就可以观察到不同的变量数值,详细方法请看第十一节内容。