goto语句在工作当中的用法

2023-10-27

前言

goto语句在C语言编程中是比较少用的,在学习C语言时老师也告诉要少用,有的甚至说别用。后来再工作当中,看到了前辈写的代码里用了goto语句,顿时感到goto语句的精妙,遂在此记录。goto语句能使用,不过要慎用,应为C语言的代码中大多是顺序结构和循环,这是便于理解的,goto语句是强制跳转语句,打破了顺序结构和循环结构,让程序跳转不利于理解,如果使用不当会导致程序出现问题而且不易查觉。

goto的简单介绍

goto是强制跳转语句,使用goto语句后,程序就会跳转到指定程序处执行。在程序中要使用标号,具体格式是"名字+:",比如"exit:"使用goto语句:goto exit; 就会跳转到exit处继续执行程序。

goto的使用实例

#include <stdio.h>

#define FAIL 	(-1)
#define OK		(0)

int mutex_creat(void ** mutex);
int mutex_lock(void* mutex);
int mutex_unLock(void* mutex);
int fun1(void);
int fun2(void);

int fun(void)
{
	int * p1, p2;
	int status = 0;
	static void * mutex = NULL;
	
	//初始化
	p1 = p2 = NULL;
	
	//申请资源代码
	p1 = (int *)malloc(sizeof(int) * 20);
	p2 = (int *)malloc(sizeof(int) * 20);
	if(NULL == mutex)
	{
		mutex_creat(&mutex);
	}

#if 1

	//功能代码:用goto语句
	mutex_lock(mutex);	//上锁

	status = fun1();
	if(FAIL == status)
	{
		goto exit;
	}


	status = fun2();
	if(FAIL == status)
	{
		goto exit;
	}

#else

	//功能代码:不用goto语句
	mutex_lock(mutex);	//上锁

	status = fun1();
	if(FAIL == status)
	{
		free(p1);
		free(p2);
		mutex_unLock(mutex);//解锁

		return status;
	}


	status = fun2();
	if(FAIL == status)
	{
		free(p1);
		free(p2);
		mutex_unLock(mutex);//解锁

		return status;
	}

#endif


exit:
	
	free(p1);
	free(p2);
	mutex_unLock(mutex);//解锁

	return status;

}

代码解析:上面的代码时不完整的,主要是用来讲解goto语句在工作中的常见用法。fun函数包括变量定义、初始化、申请资源、实现的功能代码、退出等几部分。在fun函数中,无论是正常退出还是异常退出,都需要释放资源和解锁,否则会造成内存泄漏和死锁。如果不采用goto语句,那在每一处返回的地方都要写一遍释放资源和解锁的代码,这些代码都是重复的,会让程序显得臃肿。如果使用了goto语句,就只需要在最后处写上释放资源和解锁的代码,然后中途执行失败就跳转到此处退出函数,这样会显得代码简洁。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

goto语句在工作当中的用法 的相关文章

  • 微信小程序分享功能总结

    小程序实现分享功能有如下三种方式 1 在js文件中实现onShareAppMessage函数 即可点击右上角菜单分享给微信好友 页面中默认已实现 在js文件中实现onShareTimeline函数 即可点击右上角菜单分享到微信朋友圈 需要自
  • 联盟链走向何方

    联盟链技术哪家强 开源架构Fabric FISCO BCOS 以下简称 BCOS CITA 技术对比 出品 碳链价值研究院 01 摘要 第 46 届世界经济论坛达沃斯年会将区块链与人工智能 自动驾驶等一并列入 第四次工业革命 经济学人 曾在
  • qt5.5.1 移植4412的问题过程

    编译错误 WTF wtf unicode wchar UnicodeWchar h In function bool WTF Unicode isAlphanumeric UChar WTF wtf unicode wchar Unicod

随机推荐

  • 开源项目部署之悟CRM部署 PHP服务端版

    文章目录 前言 一 部署环境 二 部署流程 1 安装宝塔等基础环境 2 部署CRM 点击安装即可 在这里插入图片描述 https img blog csdnimg cn 4f83ede5d3f74343a927f8a641c25e19 pn
  • 助推打造全球研发中心城市

    阿里 社招 一面 面不动了 真的面不动了一 项目挑一个你觉得最有挑战性的细说 有些细节被质疑了 嘴在前面飞脑子在后面追 以后说每一句话都要小心 笑cry 二 八股1 聚簇索引和非 题解 检索产品名称和描述 一 select prod nam
  • 3D关键点检测(2020-2017)

    3D关键点检测 1 3D关键点检测之PoseDRL Deep Reinforcement Learning for Active Human Pose Estimation AAAI2020 这篇文章可能与我们通常所处理的姿态估计任务略有不
  • 【BEV】BEVDet

    BEVDet 解析 BEVDet 模型 bevdet r50 训练配置 Scale NMS 优化配置 推理记录 注册 随机种子 总结 BEVDet BEVDet继承于CenterPoint gt MVTwoStageDetector 模型实
  • 射频工程师笔记---射频通信基础

    文章更新或问题可关注本人公众号 回顾一下移动通信技术的发展 其实是互联网和通信技术的融合过程 在这个过程中 很多应用都在不断加入其中 比如计算机跟通信的融合产生了互联网 互联网跟手机的融合带来了移动互联网 手机可以看杂志 看视频 听音乐 于
  • SpringCLoud——服务的拆分和远程调用

    服务拆分 服务拆分注意事项 一般是根据功能的不同 将不同的服务按照功能的不同而分开 微服务拆分注意事项 不同微服务 不要重复开发相同业务 微服务数据独立 不要访问其他微服务的数据库 微服务可以将自己的业务暴露为接口 供其他微服务调用 远程调
  • C++ 数据结构与算法(五)(哈希表)

    哈希表 1 定义 哈希表 Hash table 也称散列表 是根据关键码的值而直接进行访问的数据结构 一般哈希表都是用来快速判断一个元素是否出现集合里 只需要在初始化时用哈希函数 hash function 将这些元素映射在哈希表的索引上
  • WJ的Direct3D简明教程2:Render-To-Texture

    转载请注明 来自http blog csdn net skyman 2001 Rendering to a texture is one of the advanced techniques in Direct3D On the one h
  • Unity绘制户型(一)

    户型绘制主要对象数据 点 线 面 部件 门窗 主要难点是通过绘制的点寻找闭合多边形 多边形的生成 3D墙体的生成 门窗要在墙体上留下孔洞这四个功能 这篇文章我只写前两个问题 后面来两个问题单独再写一篇文章 1 如何寻找闭合多边形 我的方法是
  • 内容管理系统测试实战

    使用django和restframework开发接口 使用postman测试接口 使用unittest和requests模块测试接口 目录 Django安装 Django Rest Framework 创建API应用 数据库迁移 创建超级管
  • C++11中pair的用法

    概述 pair可以将两个数据组合成一种数据类型 C 标准库中凡是必须返回两个值的函数都使用pair pair有两个成员变量 分别是first和second 由于使用的struct而不是class 因此可以直接访问pair的成员变量 基本用法
  • Python_某宝某东秒杀抢购

    纯学习分享 只用于学习用途 请勿用于任何商业用途 本人不承担任何责任 视频编写过程 某宝秒杀程序 某宝源码 from selenium import webdriver from selenium webdriver common by i
  • springboot配置shiro多项目实现session共享的详细步骤

    springboot配置shiro多项目实现session共享的详细步骤 项目的配置步骤我已写到另一篇文章中 shiro框架 多项目登录访问共享session的实现 springboot redis shiro 的实现项目已共享到GitHu
  • 关于Tomcat端口被占用的情况

    今天打开eclipse突然发现运行不了 报错的提示为 Several ports 8005 8080 8009 required by Tomcat v7 0 Server at localhost are already in use 有
  • Android studio遇到问题:Emulator: PANIC: Cannot find AVD system path. Please define ANDROID_SDK_ROOT

    前言 在使用android studio时 配置模拟器的时候一直在报错这个 然后网上找到问题 并实际解决了问题 在这里记录下 目录 问题原因 没有配置环境的情况下 是因为他默认找的是这个路径的AVD 问题很明显了 中文路径导致的 C Use
  • Vue路由 传参几种方式

    动态路由传参 path detail username name a component gt import components Detail vue
  • windows server 2012 安装gooderp

    概述 这是我安装的第一个erp系统 为什么选择gooderp 因为它是开源的 个人认为还是不错的一个erp系统 windows上安装完全是傻瓜式的安装 介绍下环境 我使用的是阿里云的windows server 2012 为了安全呢最好更新
  • 前端浏览器常见兼容性问题及解决方案

    目录 1 最常见的 每个浏览器的默认margin padding大小都不同 当设置定位时会有些许差异 2 图片默认有间距 当几个img标签放到一起时 有些浏览器会有默认间距 加上第一条的设置的通配符样式也无用 3 min height问题
  • mc服务器查看死亡位置,我的世界查询死亡地点指令

    发布时间 2016 06 01 很多朋友在玩我的世界这款游戏时总会有各种意外死亡发生 今天蚕豆网小编带给大家的是我的世界死亡后怎么才能使东西不掉落的方法 游戏中的设定死亡后 你身上的物品会掉落在地上 需要快速的捡回 要不然东西就会消失 那么
  • goto语句在工作当中的用法

    前言 goto语句在C语言编程中是比较少用的 在学习C语言时老师也告诉要少用 有的甚至说别用 后来再工作当中 看到了前辈写的代码里用了goto语句 顿时感到goto语句的精妙 遂在此记录 goto语句能使用 不过要慎用 应为C语言的代码中大