万恶的goto关键字

提到goto, 大家一定能想到迪杰斯特拉发表的著名论文goto有害论(Go To Statement Considered Harmful)。正是它推动了结构化程序设计语言的发展。公正地说,goto并非那么可怕,机器码/汇编码本身支持跳转,就是goto的底层形态。计算机程序中条件选择、循环等语句最终依然依靠跳转指令完成,只是高级编程语言不建议用goto, 会造成程序员的困扰。但,机器从来都没困扰过,CPU根据jmp或j*指令的地址改写RIP地址并执行,丝滑无比,从未抱怨过。

"万恶"的goto

  • 越靠近底层的语言可能会支持goto,例如汇编和C/C++, 更高级的编程语言尽可能废弃goto, C#又是个特例,它也支持goto.

  • goto就像一个小孩子,一会哭一会闹,完全get不到他想要什么。但如果是一个专业的技术员,goto能发挥他最大能力,因为他随时都知道应该去哪里做什么。

  • “goto是魔鬼”并不总正确。内核和驱动代码为了更鲁棒,有健全的出错处理机制,出错处理一般会被定义成label, 在出错情形较多时用goto是最佳化跳转,而不是多种条件判断出错处理。

  • Rust改进C语言出错处理逻辑,避免过多判断,引入match语句匹配OK或fail场景,更清晰可靠。

  • Go语言是C语言的进化版,引入defer语句解决延迟错误处理,避免C语言大量出错处理。

  • PHP和C语言类似,也支持goto.

goto的内部实现

  • goto是无条件跳转,可对应汇编jmp.

  • 汇编代码隐式包含所在代码”地址”, 程序员可以手动加上任意label给goto提供跳转位置。
    • 当然也可以根据汇编代码的堆栈相对位置(如EBP/ESP/PC)跳转,不需要额外定义label.
    • 标签label服务于程序员和编译器,不会增加机器码长度。

  • break/continue/return本质都是可控/受限的”goto”.

  • 当然,关键字和数字不能当做label.


微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是程序员小迷(致力于C、C++、Java、Kotlin、Android、iOS、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

欢迎关注。助您在编程路上越走越好!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/148077.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Games101笔记-二维Transform变换(二)

1、什么是Transform Transform就是通过一个矩阵,进行缩放、旋转、平移等变换 2、缩放、旋转、切变、平移等基础变换 缩放变换: 反射变换: 切变: 绕原点旋转: 以上都是线性变换: 平移变换&#xf…

比核废水更严重更值得关注的可能是日常饮水这件事

7月16日 核污水排海已经完成第7轮 核污水的危害很大 据东京电力公司称,此次的核污水中浓度超标的放射性元素有64种之多。虽然经过处理,除氚之外的62种放射性物质达到日本国家环境排放标准,但更危险的放射性元素比如碳-14、碘-129等&#xf…

【Python】PythonRobotics:机器人算法的 Python 实现

在机器人技术的研究和开发中,理解和实现各种机器人算法是至关重要的。PythonRobotics 是一个开源项目,它提供了大量机器人算法的 Python 实现,这些算法覆盖了机器人科学的多个领域,包括定位、建图、导航、路径规划等。 ⭕️宇宙起…

Java——包装类及认识泛型

包装类: 在学习泛型之前我们一定要认识包装类。 在Java 中,由于基本类型不是继承自 Object ,为了在泛型代码中可以支持基本类型, Java 给每个基本类型都对应了一个包装类型。 除了int类型和char类型的包装类不是它们对应的基本类型…

zTasker自动化任务的小工具

一、简介 zTasker(详情请戳 官网)是一款完全免费支持定时、热键或条件触发的方式执行多种自动化任务的小工具,支持win7-11。其支持超过 100 种任务类型和 30 种定时/条件执行组合方法,可轻松任意调节更改任务类型达到理想效果。…

【计算机组成原理】实验一:运算器输入锁存器数据写实验

目录 实验要求 实验目的 主要集成电路芯片及其逻辑功能 实验原理 实验内容及步骤 实验内容 思考题 实验要求 利用CP226实验箱上的K16~K23二进制拨动开关作为DBUS数据输入端,其它开关作为控制信号的输入端,将通过K16~K23设定…

科技云报到:以数据“价值三角”为擎,探索数据治理实践路径

科技云报到原创。 过去四十年,经济发展主要来自于土地、劳动力、农业技术、工业技术等要素的充分释放。面向数字经济时代,无论是大模型、自动驾驶还是具身智能、人形机器人,数据已然成为继土地、劳动、资本和技术之后的又一种战略资产和新型…

低代码消息中心——提升应用交互效率的利器

在数字化飞速发展的今天,应用程序已成为我们日常生活与工作中不可或缺的一部分。随着应用功能的日益复杂,用户对于实时、高效的信息交互需求也日益增长。在这一背景下,低代码消息中心应运而生,以其便捷、灵活的特性,为…

LIN总线CAPL函数—— 设置报头同步间隔场长度(linSetBreakLength)

🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】🍅 玩转CANoe&…

BiGRU——提高基于 RNN免疫反应预测的准确性

导言 论文地址:https://arxiv.org/abs/2208.04314 深度学习在免疫学领域的应用 人们有一种叫做免疫系统的系统来保护自己免受外来有害物质(包括病毒和细菌)的侵害。免疫系统是指包括白细胞在内的人体内各种元素相互配合以保卫身体的系统&a…

【UE5】将2D切片图渲染为体积纹理,最终实现使用RT实时绘制体积纹理【第三篇-着色器光照】

在前两篇文章中,我们分别拆解描述了实现原理,并进行了基础的着色器制作。在这一篇文章中,我们将为它实现光照效果 简单的概述 当光线射入体积时,随着光线射入距离的增加,体积中的介质会对光线产生反射和吸收作用&…

【已解决】ElementPlus 的 el-menu 组件如何用 js 控制展开某个子菜单,并在其他组件中控制使用呢?

文章目录 需求几次探索官网寻找线索(解决办法) 需求 我如何用代码来实现 ElementPlus 的菜单的展开和收缩呢? 几次探索 尝试通过找到节点之后,使用 click 事件,失败了 // 伪代码如下 const handleFindNodeAndClick …

力扣:用队列模拟栈

题目描述 解题 class MyStack {Queue<Integer> queue;int size 0;public MyStack() {queue new LinkedList<Integer>();}public void push(int x) {queue.offer(x);size;}public int pop() {for(int i 0; i < size - 1; i){queue.offer(queue.poll());}size…

LLM - 理解 多模态大语言模型(MLLM) 的 幻觉(Hallucination) 与相关技术 (七)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/142463789 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 多模态…

Perfetto-Android开发分析神器(性能、内存、线程调度)

一、Perfetto内存分析 1.1Prefetto内存分析优势 Prefetto相比其他的sysmem、sysinfo或者追踪堆栈的方式进行内存相关问题的追踪具有更强的可视化以及调用层级更加详细的优势&#xff0c;很多时候能精确到某一个结构体&#xff0c;更加便于在内存泄漏环境下的问题定位。 1.1.1…

数据驱动农业——农业中的大数据

橙蜂智能公司致力于提供先进的人工智能和物联网解决方案&#xff0c;帮助企业优化运营并实现技术潜能。公司主要服务包括AI数字人、AI翻译、埃域知识库、大模型服务等。其核心价值观为创新、客户至上、质量、合作和可持续发展。 橙蜂智农的智慧农业产品涵盖了多方面的功能&…

美信监控易的优势:长期稳定运行

美信监控易作为一款运维产品&#xff0c;其显著的优势在于能够长期稳定运行。在IT运维领域&#xff0c;系统的稳定性是至关重要的&#xff0c;它直接关系到企业的业务连续性和客户满意度。美信监控易通过其自研的数据库和先进的监测技术&#xff0c;确保了系统的高可用性&#…

Mysql高级篇(中)——事务篇

事务篇 一、数据库事务概述&#xff08;1&#xff09;概念&#xff08;2&#xff09;事务的处理原则&#xff08;3&#xff09;事务的特性(ACID)&#xff08;4&#xff09;事务的创建 二、如何使用事务三、事务隔离级别&#xff08;1&#xff09;分类&#xff08;2&#xff09;…

每日一练:二叉树的中序遍历

94. 二叉树的中序遍历 - 力扣&#xff08;LeetCode&#xff09; 一、题目要求 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2]示例 2&#xff1a; 输入&#xff1a;root …

探索Allure Report:提升自动化测试效率的秘密武器

一.使用 Allure2 运行方式-Python # --alluredir 参数生成测试报告。 # 在测试执行期间收集结果 pytest [测试用例/模块/包] --alluredir./result/ (—alluredir这个选项 用于指定存储测试结果的路径) # 生成在线的测试报告 allure serve ./result 二.使用 Allure2 运行…