C语言禁术——goto语句
goto语句是一种无条件转移语句,goto 语句的使用格式为:
goto 语句标号;
其中标号是一个有效的标识符,这个标识符加上一个“:”(冒号)一起出现在函数内某处,执行goto语句后,程序将跳转到该标号处并执行其后的语句。
另外标号必须与goto语句同处于一个函数中,但可以不在一个循环层中。通常goto语句与if条件语句连用,当满足某一条件时,程序跳到标号处运行。
goto语句通常不用,主要因为它将使程序层次不清,且不易读,但在多层嵌套退出时,用goto语句则比较合理。
大多数人在学习C语言的时候都或多或少的看过或者听过不要使用goto语句,但是,在某些时刻,该goto时就goto。
eg:
#include <stdio.h>
#include <stdint.h>
#include <string.h> int main(void)
{
for(int i=;i<;i++)
for(int j=;j<;j++)
{
if(i+j==)
{
goto test;
}
}
test:
printf("test...\n");
return ;
}

这个例子可能是大家见的最多的跳出循环用法,因为这里break不好使。但是。。。
eg:
#include <stdio.h>
int main(void)
{
int a=;
if(a>)
{ for(int i=;i<;i++)
{
printf("i=%d ",i);
if(i==)
goto test;
}
}
test:
printf("\r\nyes");
return ;
}

第一次尝试使用goto的时候,有一个误区,就是如果没有执行goto,goto的标签会不会执行?
我之前以为不会执行,但是,goto的标签,就是程序的一部分,哪怕没有执行goto,goto的标签也会顺着程序执行流程而执行(如上图测试一样)。这就给我们写程序的时候带了隐藏的bug,千万别以为goto不执行,标签就不执行了。
Summary:
在我们使用goto跳出循环或者处理关键代码段的时候,goto标签的位置,一定是异常处理的位置,哪怕不执行goto,标签也会执行。但很多时候,goto出去的代码段都是关键代码处理,在没有执行goto的时候,我们不想标签处的代码被执行(比如异常处理),这样我们就可以通过下面的方式做到:
eg:
#include <stdio.h>
int main(void)
{
int flag=;
int a=;
if(a>)
{ for(int i=;i<;i++)
{
printf("i=%d ",i);
if(i==)
{
flag=;
goto test;
}
}
}
if(flag==)
{
test:
printf("\r\nyes");
}
return ;
}

C语言禁术——goto语句的更多相关文章
- 正确使用goto语句
是否应该使用goto语句 goto语句也被称为无条件转移语句,它通常与条件语句配合使用来改变程序流向,使得程序转去执行语句标号所标识的语句. 关于是否应该使用goto语句,历史上也争论不休.恐怕国内大 ...
- 臭名远扬之 goto 语句
C 语言自学之 goto 语句 Dome1:以下程序实现从控制台输出1-10,使用goto语句,实现当输出完3之后跳出循环体. 1 #include <stdio.h> 2 3 int m ...
- Go 语言 goto 语句
Go 语言的 goto 语句可以无条件地转移到过程中指定的行. goto语句通常与条件语句配合使用.可用来实现条件转移, 构成循环,跳出循环体等功能. 但是,在结构化程序设计中一般不主张使用goto语 ...
- 2_C语言中的数据类型 (九)逻辑运算符与if语句、switch、条件运算符?、goto语句与标号
1 条件分支语句 1.1 关系运算符 在C语言中0代表false,非0代表真 1.1.1 < 小于 1.1.2 <= 小于 ...
- C语言 goto语句
/* goto语句 */ #include <stdio.h> #include <stdlib.h> #include <string.h> /* goto语句也 ...
- C语言goto语句的使用
不使用goto语句: 使用goto语句: 使用goto语句时需要注意以下原则:1) 不要过份地使用.比如图2中的60行就没有采用goto语句跳到程序的最后面,之所以这里不使用goto是为了阅读方便.因 ...
- 通过goto语句学习if...else、switch语句并简单优化
goto语句在C语言中实现的就是无条件跳转,第二章一上来就介绍goto语句就是要通过goto语句来更加清楚直观的了解控制结构. 我理解的goto语句其实跟switch语句有相似之处,都是进行跳转.不同 ...
- 【C语言】07-基本语句和运算
一.基本语句 C语言的基本语句跟Java中的差不多,所以,这里只是简单地提一下 循环语句(do while.while.for) 条件语句(if .if-else.switch) goto语句 二.基 ...
- 在程序中,你敢怎样使用“goto”语句!
用goto是一个个人爱好的问题.“我”的意见是,十个goto中有九个可以用相应的结构化结构来替换.在那些简单情形下,你可以完全替换掉goto,在复杂的情况下,十个中也有九个可以不用:你可以把部分代码写 ...
随机推荐
- 【Redis】Redis的常规操作命令
NoSQL是一种非关系型数据库,非关系型数据库库和传统的关系型数据库不同,非关系性体现在不需要依赖表进行数据存储.常见的非关系型数据库有Redis.MonoDB.HBase等,这些是基于key-val ...
- 【Oracle 】pctfree和pctused详解
一.建立表时候,注意PCTFREE参数的作用 PCTFREE:为一个块保留的空间百分比,表示数据块在什么情况下可以被insert,默认是10,表示当数据块的可用空间低于10%后,就不可以被insert ...
- openkm预览功能报错:flexpaper License key not accepted(no key passed to viewer)
openkm:6.3.4 使用google浏览器打开,想预览文件,但是pdf.word和图片都不能显示.只是显示空白. 换成IE后,再次尝试,发现了报错信息: 解决方案: 1- Stop openkm ...
- process credentials(三)
主要内容包括: 1.进程描述符中Realtime Mutex相关数据结构的初始化 2.子进程如何复制父进程的credentials 3.per-task delay accounting的处理 4.子 ...
- Fix SCRIPT5009: “RegisterSod” undefined error
When I set up development environment for apps for SharePoint 2013 and quickly get apps from SharePo ...
- 转 Kafka docker
Kafka 教程 http://haofly.net/kafka/ Posted on 2016-12-23 | In tools | | Views: 224 重要概念 生产者(Produc ...
- 重新认识Javascript的一些误区总结
1.在函数内有没有var真的不一样 下面这样一段代码,在函数abc()中,创建了两个变量a, c,并在函数体之外进行alert,想看看有什么事发生: <script> function a ...
- centos 安装pecl
一.更新yum源,安装php7 CentOS/RHEL 7.x: 1 rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-lates ...
- 微软牛津项目人脸识别API初探
按照董子的这篇博客中的介绍,到微软牛津项目的网站申请到测试用的人脸识别Key,按照官方文档的介绍,把wpf项目建好之后,按照一步步的流程下来就可以完成example中的功能了.但是这仅仅是个examp ...
- ARM:移动GPU往PC GPU效能迈进
行动装置的热潮持续不退,各大手机制造商除了想尽办法推出外型酷炫的行动装置设备来吸引消费者的目光之外,更在行动应用处理器玩起多核心的「核」战争,无非是希望能够带给消费者更优异的效能新体验.然而,随着消费 ...