1.前言

goto,一个蒟蒻一用就废,大佬一用就吊炸天的神奇关键字。

今天,我要来盘它!!!

2、goto只能在函数内实现跳转,不能跨函数跳转

因为标号label是局部有效的。

#include <iostream>
#include <vector>
using namespace std; void fun(){
loop:
for (int i = 0; i < 2; ++i) {
cout<<"loop"<<endl;
}
goto loop;
};
int main() {
fun(); return 0;
}

这样会一直打印loop,正常。

#include <iostream>
#include <vector>
using namespace std; void fun(){
loop:
for (int i = 0; i < 2; ++i) {
cout<<"loop"<<endl;
}
goto loop;
};
int main() {
goto loop;
return 0;
}

会报错,说loop标号未定义,说明识别不到别的函数内的标号,也就没法跳转。

那把标号标到别的函数前面会怎样?

#include <iostream>
#include <vector>
using namespace std; label:void fun(){
loop:
for (int i = 0; i < 2; ++i) {
cout<<"loop"<<endl;
}
goto loop;
};
int main() {
goto label;
return 0;
}

结果也是一样,识别不出来label这个标号。说明goto能识别的标号也必须在它所在的函数内。

3、基本功能跳转

#include <iostream>
using namespace std; int main()
{
int x;
cin>>x;
if(x<2)
{
goto ld;
}
ls:
cout<<x<<endl;
ld:
cout<<x<<endl;
return 0;
}
输入1,输出1
输入2,if语句不执行,顺序执行代码,输出1,1

4、跳出本次循环,功能类似continue

先尝试,直接像continue那样使用。

#include <iostream>
#include <vector>
using namespace std;
int main() { label:
for (int i =0; i < 3; ++i) {
if(i == 1)
goto label;
cout<<i<<endl;
}
return 0;
}
最后一直循环打印0;
解释:i一开始是0,然后++i,i为1;这时候goto label,跳转去的for循环,i重新被初始化为0,就这样重复这个循环。。。

考虑到上面是因为被重新初始化,达不到效果,将初始化放外面。

#include <iostream>
#include <vector>
using namespace std;
int main() {
int i =0;
label:
for (; i < 3; ++i) {
if(i == 1)
goto label;
cout<<i<<endl;
}
return 0;
}
这时候只打印一个0出来
解释i一开始为0,打印出来,++i后i为1,if条件成立,goto label,这时候++i没有执行,i仍然为1,这样就会一直循环下去,所以这个也是死循环,只不过不打印。。。

由于上面是因为++i不执行造成的死循环,我们将++i放在里面.

#include <iostream>
#include <vector>
using namespace std;
int main() {
int i =0;
label:
for (; i < 3; ) {
if(i == 1)
{
++i;
goto label;
}
else
{
cout<<i<<endl;
++i;
} }
return 0;
}
打印出0,2,程序也正常退出,达到预期效果。
但是这个for循环被大改,失去了for循环使用的简单性。有点像do。。while了有没有?所以。。。

使用do…while,while版本达到continue效果。

#include <iostream>
#include <vector>
using namespace std;
int main() {
int i =0;
loop:
do{
if(i==1)
{
++i;
goto loop;
} cout<<i<<endl;
++i;
}while(i<3);
return 0;
}
输出0,2,达到预期效果。
#include <iostream>
#include <vector>
using namespace std;
int main() {
int i =0;
loop:
while(i<3){
if(i == 1)
{
++i;
goto loop;
}
cout<<i<<endl;
++i;
}
return 0;
}
输出0,2。达到预期效果。

5、goto往后跳,跳转到循环外的下一条语句,效果同break,用于多重循环跳出。

#include <iostream>
#include <vector>
using namespace std;
int main() {
for (int i = 0; i < 3; ++i)
for (int j = 0; j < 4; ++j)
for (int k = 0; k < 5; ++k)
if(k == 1)
goto label; label:
cout<<"break for"<<endl;
return 0;
}
打印出break for,程序也正常结束。

6、goto往前跳,可以形成循环

#include <iostream>
#include <vector>
using namespace std;
int main() {
label:
cout<<"front"<<endl;
goto label;
return 0;
}
循环打印front,而且还是死循环。
解释:goto跳到哪条语句就从哪条语句继续往下执行,直到程序块结束。

7、goto跳转到goto语句

#include <iostream>
#include <vector>
using namespace std;
int main() { goto label2;
label1:
cout<<"label1"<<endl;
label2:
{
cout<<"label2"<<endl;
goto label1;
}
return 0;
}
goto的标号中又有goto语句,也是可以的。

个人感受

好东西是好东西,不会用就自掘坟墓。。。。

goto关键词的更多相关文章

  1. java中break,continue,标签实现goto效果(编程思想)

    goto 编程语言中一开始就有goto关键词了.事实上,goto起源于汇编语言的程序控制:“若条件A成立,则调到这里:否则跳到那里”. goto语句时在源码级别上的跳转,这导致了其不好的名誉.于是go ...

  2. <转载>C#与JAVA的区别 http://www.cnblogs.com/Asa-Zhu/archive/2012/11/08/2761114.html

    C#(C-Sharp)是Microsoft的新编程语言,被誉为“C/C++家族中第一种面向组件的语言”.然而,不管它自己宣称的是什么,许多人认为C#更像是Java的一种克隆,或者是Microsoft用 ...

  3. C和C++中的volatile、内存屏障和CPU缓存一致性协议MESI

    目录 1. 前言2 2. 结论2 3. volatile应用场景3 4. 内存屏障(Memory Barrier)4 5. setjmp和longjmp4 1) 结果1(非优化编译:g++ -g -o ...

  4. java.c++.c#.c的区别

    C++则一般看作是对C语言的扩展. Java语言是一种完全的面向对象语言,虽然它的底层(运行时库)是用C语言开发的,可是并不依赖于C. C#是微软开发的一种编程语言,语法类似Java,几乎就是从Jav ...

  5. [转] C#与Java的比较

    [转] C#与Java的比较 转自:C#与Java的比较 2015-06-26 目录 一.C#.C++和Java二.语言规范的比较  2.1.简单数据类型  2.2.常量  2.3.公用类的入口点  ...

  6. 程序设计入门-C语言基础知识-翁恺-第四周:循环控制-详细笔记(四)

    目录 第四周:循环控制 4-1 for循环 4-2 循环控制 各运算符优先级(图) 4-3 课后习题 4-4 讨论题 第四周:循环控制 4-1 for循环 for循环像一个计数循环:设定一个计数器,初 ...

  7. 《Java编程思想》阅读笔记一

    Java编程思想 这是一个通过对<Java编程思想>(Think in java)第四版进行阅读同时对java内容查漏补缺的系列.一些基础的知识不会被罗列出来,这里只会列出一些程序员经常会 ...

  8. C# VS Java

    摘要:C#的语言规范由Microsoft的Anders Hejlsberg与Scott Wiltamuth编写.在当前Microsoft天花乱坠的宣传中,对C#和C++.Java作一番比较总是很有趣的 ...

  9. java 学习基础学习单词及java关键词

    在JAVA学习中我们难免会犯一些逻辑错误,语法错误,和一些运行错误,对于英语不好的人,就的记下下面的2常用单词,有助于我们提高在使用软件编写代码的速度和代码调试,能更便捷的找出错误,知道1中的保溜关键 ...

  10. Delphi关键词

    学习的东西越来越多难免会忘记以前的知识,即使是你的大脑很发达也不见得能记得所有的东西,单词,所以做做笔记写写小抄是一个很好的习惯,到需要的时候来翻翻看看,当然个人的作小抄的习惯也不尽相同,这里我自己做 ...

随机推荐

  1. 手机免root安装最新青龙面板(非Alpine term | Zero term软件)

    使用软件:Termux 可以用于任何支持qemu虚拟机的环境.APP 制作了基本的系统环境.开发环境和青龙面板环境.多个虚拟机,按需求下载 官方网站:https://api.wer.plus 群:10 ...

  2. Unity的IPreprocessBuildWithReport:深入解析与实用案例

    Unity IPreprocessBuildWithReport Unity IPreprocessBuildWithReport是Unity引擎中的一个非常有用的功能,它可以让开发者在构建项目时自动 ...

  3. Abstract Factory 抽象工厂模式简介与 C# 示例【创建型1】【设计模式来了_1】

    〇.简介 1.什么是抽象工厂模式? 一句话解释:   提供一个接口,以创建一系列相关或相互依赖的抽象对象,而无需指定它们具体的类.(将一系列抽象类装进接口,一次接口实现,就必须实例化这一系列抽象类) ...

  4. php批量同步数据

    php批量同步流程 首先分页获取数据 创建临时表 批量添加数据 备份原表 删除原表 修改临时表表名改为原表 代码 1 <?php 2 3 class Stock{ 4 5 private $da ...

  5. 遥遥领先 spring,中国人的 solon 来啦!10% 的体积,10倍的速度

    Solon 是什么? Java 生态型应用开发框架.它从零开始构建,有自己的标准规范与开放生态(历时五年,已有全球第二级别的生态规模).与其他框架相比,它解决了两个重要的痛点:启动慢,费内存.2023 ...

  6. 产品代码都给你看了,可别再说不会DDD(三):战略设计

    这是一个讲解DDD落地的文章系列,作者是<实现领域驱动设计>的译者滕云.本文章系列以一个真实的并已成功上线的软件项目--码如云(https://www.mryqr.com)为例,系统性地讲 ...

  7. 云服务器中Linux如何安装宝塔面板?

    作者:西瓜程序猿 主页传送门:https://www.cnblogs.com/kimiliucn 官方使用手册:https://www.kancloud.cn/chudong/bt2017/42420 ...

  8. firefox对webview性能数据监控的模拟

    现在为了降低手机端的开发成本,越来越多的手机应用采用html5在进行开发,这样可以保证一处开发,到处嵌入. 但是这样的手机性能经常会是个瓶颈,因为当体验要求变高时,大多依赖html渲染引擎来对dom数 ...

  9. xlsx和path的运用

    从后端获取Excel模板 app.get('/api/download-template', (req, res) => { const templatePath = path.join(__d ...

  10. Go之流程控制大全: 细节、示例与最佳实践

    本文深入探讨Go语言中的流程控制语法,包括基本的if-else条件分支.for循环.switch-case多条件分支,以及与特定数据类型相关的流程控制,如for-range循环和type-switch ...