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. FJOI2022 游记

    2022.3.28 省选延期,延到了4.16 2022.4.11 省选又延期,延到了5.2 FJOI 要回来了!! Day -7 开始停课了 QwQ Day -6 打摆 Day -5 打摆 不行,我不 ...

  2. async、await其实是generator和promise的语法糖

    async 关键字用于声明异步函数,await 用于在async函数中将异步代码变为同步,阻塞代码的执行 对于promise和generator不熟悉的朋友可以移步看看这些文章 Promise的理解与 ...

  3. 缓存面试解析:穿透、击穿、雪崩,一致性、分布式锁、Redis过期,海量数据查找

    为什么使用缓存 在程序内部使用缓存,比如使用map等数据结构作为内部缓存,可以快速获取对象.通过将经常使用的数据存储在缓存中,可以减少对数据库的频繁访问,从而提高系统的响应速度和性能.缓存可以将数据保 ...

  4. 一张图读懂TuGraph Analytics开源技术架构

    TuGraph Analytics(内部项目名GeaFlow)是蚂蚁集团开源的分布式实时图计算引擎,即流式图计算.通过SQL+GQL融合分析语言对表模型和图模型进行统一处理,实现了流.批.图一体化计算 ...

  5. Spring Cloud OpenFeign 的使用及踩坑指南

    目录 Feign 和OpenFeign Feign OpenFeign openFeign的优势 OpenFeign应用 1. 导入依赖 2. 使用 3. 日志配置 4. 数据压缩 OpenFeign ...

  6. selenium-wire兼容selenium和requests

    背景 在工作中UI自动化中可能会需要用到API来做一些数据准备或清理的事情,那UI操作是略低效的,但API操作相对高效. 而实战课就有这样一个案例,不过那个案例是UI操作和API分开的. 极少会遇到这 ...

  7. 1.15 自实现GetProcAddress

    在正常情况下,要想使用GetProcAddress函数,需要首先调用LoadLibraryA函数获取到kernel32.dll动态链接库的内存地址,接着在调用GetProcAddress函数时传入模块 ...

  8. 文盘Rust -- 生命周期问题引发的 static hashmap 锁

    2021年上半年,撸了个rust cli开发的框架,基本上把交互模式,子命令提示这些cli该有的常用功能做进去了.项目地址:https://github.com/jiashiwen/interactc ...

  9. 通过iptables进行wireguard的权限管理

    一.背景 由于目前openvpn的开源方案,链接VPN如果路由过多的话会导致链接速度变慢,效果非常的不理想,并且当iptables规则多的时候,转发明显性能下降: 准备采用wireguard的方式来代 ...

  10. 深入解析HTTP请求:了解请求特征与报文格式的关键秘密

    引言 在上一章节中,我们详细探讨了超文本传输协议(HTTP)的基本概念,并且延伸讨论了HTTP请求响应的基本流程.在这个过程中,浏览器首先通过DNS解析来确定要访问的服务器的IP地址,然后与服务器建立 ...