转贴自:嵌入式Hodgepodge关于C语言的goto语句存在许多争议,许多书籍建议“谨慎使用它,或者根本不使用它”。
Linux之父Linus在Linux中广泛使用goto,这也启发了我们合理地使用goto语句。
存在是合理的。
由于它是C语言的知识点,因此我们仍然需要学习使用它。
让我们看一下如何使用goto:1. goto的基本语法goto语句有两个部分:goto和标签名。
标签的命名规则与变量的命名规则相同。
如:goto标签;为了使该语句正常工作,该函数还必须包括另一个标记为label的语句,该语句以标签名称开头,后跟冒号,例如:label:printf(“ goto here”。
”);二,goto / *编译器环境示例:mingw32 gcc6.3.0 * / #include #include / * goto test * / void TestGoto(void){int i;而(1){对于(i = 0; i 10; i ++){如果(i> 6){转到标签;} printf(“%s:i =%d &quot ;, __FUNCTION__,i);}}标签:printf(“ test goto end!”);} int main(void){TestGoto();}运行结果:从运行结果中,我们显然可以知道用法goto的代码,可能会跳出多个循环在程序执行过程中,遇到goto语句时,可以跳转到标签以继续执行。
值得注意的是,goto语句和它跳转到的标签必须在同一函数中。
第三,转到,中断和继续之间的区别?跳转语句也是如此。
goto语句和break and continue语句有什么区别?实际上,中断和继续是goto的特殊形式。
使用break和continue的好处是它们的名称已经表明了它们的用法。
以下代码示例介绍一下break并继续的用法:1. Break测试功能使用上面的测试程序来构建一个功能来测试break语句void TestBreak(void);,例如:/ * break test * / TestBreak(void){int i;而(1){for(i = 0; i 10; i ++){如果(i> 6){break; / *第一个中断:跳出for循环* /} printf(“%s:i =%d &quot ;, __FUNCTION__,i);} printf("现在i =%d ",i);休息; / *第一个中断:跳出while循环* /} printf(“ test break end!”);}运行结果:从运行结果中,我们显然可以知道中断可以退出当前循环。
在此示例中,第一个break语句退出当前的for循环,第二个break语句退出当前的while循环。
可以看出,中断可以退出一个循环级别。
因此,根据break和goto的特性,我们知道,如果它跳出了Loop的许多层,使用goto会更加方便。
2.继续测试功能相同,创建一个函数来测试继续语句void TestContinue(void);,例如:/ * Continue test * / void TestContinue(void){int i; for(i = 0; i 10; i ++){if(i> 6){printf(“ i =%d,继续下一个循环 ",i);继续; / *继续:结束此循环(而不是终止该循环层)并继续进行下一个循环* /} printf(“%s:i =%d &quot ;, __FUNCTION__,i);} printf(“ test break end!”);}运行结果:从运行结果中,我们可以清楚地知道,continue可以结束此循环(而不是整个循环)并输入下一个循环循环(i。
代表循环数)。
4.支持和反对goto的原因是什么? 1.不主张使用goto的人群比例应该相对较大。
不提倡的主要原因是:很容易弄乱逻辑,也很难理解。
2.使用goto的原因这部分人认为goto可以在以下两种情况下使用更为方便:(1)跳出多层循环。
这个例子类似于我们上面的goto测试程序。
(2)异常处理。
执行功能可能会产生许多异常情况。
有几种处理方法,以代码为例:方法1:判断后,如果条件错误,直接返回。
int mystrlen(char * str){int count = 0; if(str == NULL){返回-1;} if(* str == 0){返回0;} while(* str!= 0){count ++; str ++;}返回计数;}方法二:首先设置一个变量,为该变量分配一个值,只有一个返回。
int mystrlen(char * str){int ret; if(str == NULL){ret = -1;}否则if(* str == 0){ret = 0;} else {ret = 0; while(* str!= 0){ret ++; str ++;}} return ret;}方法3:使用goto语句。
int mystrlen(char * str){int ret;如果(str == NULL){ret = -1;转到_RET;}如果(* str == 0){ret = 0; goto _RET;} while(* str!= 0){ret ++; str ++; } _RET:返回ret; }其中,第三种方法是许多人提倡的方法。
使用goto err均匀跳跃是最方便,最有效的方法。
从反汇编语句的数量可以看出,指令使用最少,消耗的寄存器最少。