首页 > 其他分享 >万恶的goto关键字

万恶的goto关键字

时间:2024-09-23 19:19:36浏览次数:9  
标签:万恶 goto 汇编 label 关键字 出错 跳转 C语言

提到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等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

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

标签:万恶,goto,汇编,label,关键字,出错,跳转,C语言
From: https://blog.csdn.net/cxsjabcabc/article/details/142466394

相关文章

  • MySQL零基础入门教程-3 条件查询、模糊查询、条件关键字和其优先级关系,基础+实战
    教程来源:B站视频BV1Vy4y1z7EX001-数据库概述_哔哩哔哩_bilibili我听课收集整理的课程的完整笔记,供大家学习交流下载:夸克网盘分享本文内容为完整笔记的第三篇 14、条件查询&模糊查询P19-2514.1什么是条件查询?不是将表中所有数据都查出来。是查询出来符合条件的条件查询需要用到whe......
  • C语言中易混淆概念的关键字
    最快的关键字----registerregister:这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中而不是通过内存寻址访问以提高效率。注意是尽可能,不是绝对。你想想,一个CPU的寄存器也就那么几个或几十个,你要是定义了很多很多register变量,它累死也可能不能全部把这些变量......
  • 多语言长文本 AI 关键字提取 API 数据接口
    多语言长文本AI关键字提取API数据接口AI/文本专有模型极速提取多语言长文本/实时语料库。1.产品功能支持长文本关键词提取;多语言关键词识别;基于AI模型,提取精准关键词;全接口支持HTTPS(TLSv1.0/v1.1/v1.2/v1.3);全面兼容AppleATS;全国多节点CDN部署;......
  • Spire.Doc for Java实现根据关键字位置盖章
    Spire.DocforJava是一款专业的JavaWord组件,开发人员使用它可以轻松地将Word文档创建、读取、编辑、转换和打印等功能集成到自己的Java应用程序中。作为一款完全独立的组件,Spire.DocforJava的运行环境无需安装MicrosoftOffice。Spire.DocforJava能执行多种Word......
  • vim matchit 自定义配对关键字之间的跳转
    vim因其强大的扩展性一直深受linux程序员的喜爱,最近在用vim写verilog的时候,由于一个逻辑块中的beginend较多,常常会多写或者漏掉匹配关键字,很是苦恼,于是寻找匹配关键字间跳转的方法,发现matchit可以用%在关键字之间实现跳转,还可以自定义更多的关键字,相当方便。以下正片:1、安装ma......
  • Java关键字详解:构建Java语言的基础元素
    Java是一门静态类型、面向对象的编程语言,其基础构建块由一系列关键字(keywords)构成。这些关键字具有特定的功能和含义,定义了Java语言的结构和语法规则。Java关键字在编译时具有特殊意义,开发者不能将其用作变量、类或方法名。本文将详细解析Java中的关键字及其用途,并结合代码......
  • 安卓平台WIFI Log关键字(华为双框架)
    安卓平台WIFILog关键字(华为双框架)HiLog关键字一STA关键字1)打开关闭WIFIsetWifiEnabled2)扫描关键字startscan|wifiscanlog|scanresults|getScanResults3)连接关键字Tryingtoassociatewith|CTRL-EVENT-ASSOC-REJECT|selectedBSS|wlan0:State|CTRL-EVENT-DI......
  • 关键字检索分析-案例2:开源代码分析
    第一次拿来分析一下开源代码,上效果图代码和文件地址具体内容参考我前面一篇博客spring-frameworkredis,redis单个文件非常大mybatis我实话我没有看过这些源码。之前的博客里的脚本,bug挺多的。可以以gitee这里为主(链接在最上面)。......
  • 变量是什么? auto register关键字
    目录变量程序的本质:二进制文件1.变量:内存上的某个位置开辟的空间2.变量的初始化:3.为什么要有变量4.局部变量与全局变量5.变量的大小由类型决定6.任何一个变量,内存赋值都是从低地址开始往高地址1.1关键字auto1.2关键字register什么样的变量可以采用register?变量程序的本质......
  • C++ 定义静态成员 static 关键字不能在定义出重复出现
    定义静态成员和其他的成员函数一样,我们既可以在类的内部也可以在类的外部定义静态成员函数。当在类的外部定义静态成员时,不能重复static关键字,该关键字只出现在类内部的声明语句:voidAccount::rate(doublenewRate){interestRate=newRate;}Note:和类的所有成员一样,当我......