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,在复杂的情况下,十个中也有九个可以不用:你可以把部分代码写 ...
随机推荐
- IKE 协议(转)
from: http://lulu1101.blog.51cto.com/4455468/817872 IKE 协议 2012-03-26 21:49:50 标签:休闲 ike 职场 IKE 协议简介 ...
- Spring使用内存数据库
有时候为了做些测试需要创建数据库及相关表,安装MySQL等轻量数据库虽然简单但还是有点麻烦?而且用于自己临时测试的数据库对象一般不会被多次使用,还是浪费?内存数据库结合ORM可以很好解决这个问题. H ...
- 信号之sigsetjmp和siglongjmp函数(转)
在信号处理程序中经常调用longjmp函数以返回到程序的主循环中,而不是从该处理程序返回. 但是,调用longjmp有一个问题.当捕捉到一个信号时,进入信号捕捉函数,此时当前信号被自动地加到进程的信号 ...
- 如何使用Git上传项目代码到github
这是我第一次应用git,以下仅供git的初学者参考. github是一个基于git的代码托管平台,付费用户可以建私人仓库,我们一般的免费用户只能使用公共仓库,也就是代码要公开.这对于一般人来说 ...
- Linux下实现脚本监测特定进程占用内存情况
Linux系统下,我们可以利用以下命令来获取特定进程的运行情况: cat /proc/$PID/status 其中PID是具体的进程号,这个命令打印出/proc/特定进程/status文件的内容,信息 ...
- OpenGL tutorial资源在mac yosemite下的cmake生成工程问题
如果你在使用cmake -G Xcode -Wno-dev OpenGL_Tutorial 时,出现了pThread.h not found的错误, 碰巧你和我一样使用的还是 2.8 版本的cmake ...
- matlab入门笔记(一):常用快捷键
摘自<matlab从入门到精通>胡晓东 matlab命令窗口常用快捷键与命令 matlab的工作空间和变量编辑窗口 搜索命令help和look for
- mysql在插入或更新的时候对一个字段赋递增值
在我们有一个需求是更新某个表里面的某个字段,让这个字段变成一个递增的值,或者插入某个表中使得某些字段的值是递增的.下面我们来看看具体的操作: 更改表字段为递增 首先设置一个变量,初始值为任意数值,这里 ...
- html与表格(table)相关的属性
<table> 标签定义 HTML 表格.简单的 HTML 表格由 table 元素以及一个或多个 tr.th 或 td 元素组成.tr 元素定义表格行,th 元素定义表头,td 元素定义 ...
- Centos7源代码安装freeswitch和启动freeswitch
centos7下安装freeswitch版本:1.6. 1.下载源代码: 进入目录 cd /usr/local/src 克隆原代码 git clone -b v1.6 https://freeswit ...