C++流程控制中用于跳转的return和goto语句学习教程
return语句
终止函数的执行并返回对调用函数的控制(或对操作系统的控制,如果您从main函数转移控制)。紧接在调用之后在调用函数中恢复执行。
语法
return[expression];
备注
expression子句(如果存在)将转换为函数声明中指定的类型,就像正在执行初始化一样。从该类型的表达式到return类型的函数的转换会创建临时对象。
expression子句的值将返回调用函数。如果省略该表达式,则函数的返回值是不确定的。构造函数和析构函数以及类型为void的函数无法在return语句中指定表达式。所有其他类型的函数必须在return语句中指定表达式。
当控制流退出封闭函数定义的块时,结果将与执行不带表达式的return语句所获得的结果一样。这对于声明为返回值的函数无效。
一个函数可以包含任意数量的return语句。
以下示例将一个表达式与return语句一起使用来获取两个整数中的最大者。
//return_statement2.cpp #include<stdio.h> intmax(inta,intb) { return(a>b?a:b); } intmain() { intnOne=5; intnTwo=7; printf_s("\n%disbigger\n",max(nOne,nTwo)); }
goto语句
goto语句无条件地将控制权转移给由指定的标识符标记的语句。
语法
gotoidentifier;
备注
由identifier指定的标记语句必须位于当前函数中。所有identifier名称都是内部命名空间的成员,因此不会干扰其他标识符。
语句标签仅对goto语句有意义;其它情况下,语句标签将被忽略。不能重新声明标签。
尽可能使用break、continue和return语句而不是goto语句是一种好的编程风格。但是,因为break语句仅退出循环的一个级别,所以可能必须使用goto语句退出深度嵌套的循环。
在此示例中,当i等于3时,goto语句将控制权转移给标记为stop的点。
//goto_statement.cpp #include<stdio.h> intmain() { inti,j; for(i=0;i<10;i++) { printf_s("Outerloopexecuting.i=%d\n",i); for(j=0;j<2;j++) { printf_s("Innerloopexecuting.j=%d\n",j); if(i==3) gotostop; } } //Thismessagedoesnotprint: printf_s("Loopexited.i=%d\n",i); stop: printf_s("Jumpedtostop.i=%d\n",i); }
输出:
正在执行外部循环。i=0 正在执行内部循环。j=0 正在执行内部循环。j=1 正在执行外部循环。i=1 正在执行内部循环。j=0 正在执行内部循环。j=1 正在执行外部循环。i=2 正在执行内部循环。j=0 正在执行内部循环。j=1 正在执行外部循环。i=3 正在执行内部循环。j=0 跳转以停止。i=3
控制的转移
可以在goto语句中使用语句或switchcase标签来指定分支超出初始值设定项的程序。此类代码是非法的,除非包含初始值设定项的声明在跳转语句发生的块所封闭的块中。
下面的示例显示了声明和初始化对象total、ch和i的循环。也存在将控制权传递过初始值设定项的错误goto语句。
//transfers_of_control.cpp //compilewith:/W1 //Readinputuntilanonnumericcharacterisentered. intmain() { charMyArray[5]={'2','2','a','c'}; inti=0; while(1) { inttotal=0; charch=MyArray[i++]; if(ch>='0'&&ch<='9') { gotoLabel1; inti=ch-'0'; Label1: total+=i;//C4700:transferspastinitializationofi. }//iwouldbedestroyedhereifgotoerrorwerenotpresent else //Breakstatementtransferscontroloutofloop, //destroyingtotalandch. break; } }
在前面的示例中,goto语句尝试将控制权传递过i的初始化。但是,如果已声明但未初始化i,则该传递是合法的。
在用作total语句的chstatement的块中声明的对象和while在使用break语句退出此块时将被销毁。