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. 没有显示器可用的电脑找IP

    一台在手边没有显示器可用的电脑找IP记录 问题 老大给我一台服务器(在我前面的工位)让我自己玩,但是不知道IP地址,我本来想用自己的显示器连上,结果两个DHMI口试过都没反应,不知道ip地址就没法连上 ...

  2. appium环境搭建python

    python appium环境搭建   appium是什么? 1,appium是开源的移动端自动化测试框架:2,appium可以测试原生的.混合的.以及移动端的web项目:3,appium可以测试io ...

  3. CentOS安装ffmpeg并转码视频为mp4

    前言 现需要将一批avi格式的视频转码为mp4,以下为操作步骤.系统版本为CentOS 7. 如果不安装x264,转码后只有声音,没有视频. 编译安装nasm wget https://www.nas ...

  4. Unity的UnityStats: 属性详解与实用案例

    UnityStats 属性详解 UnityStats 是 Unity 引擎提供的一个用于监测游戏性能的工具,它提供了一系列的属性值,可以帮助开发者解游戏的运行情况,从而进行优化.本文将详细介绍 Uni ...

  5. MIT6.s081/6.828 lectrue4:page tables 以及 Lab3 心得

    不管是计算机组成还是操作系统,虚拟内存都是其中的重要内容,所以这一节我会结合 CSAPP 第九章:虚拟内存 来一起复习(顺便一说,CSAPP 这一节的 lab 是要求设计一个内存分配器,也是很有意思的 ...

  6. 高性能MySQL实战(一):表结构

    最近因需求改动新增了一些数据库表,但是在定义表结构时,具体列属性的选择有些不知其所以然,索引的添加也有遗漏和不规范的地方,所以我打算为创建一个高性能表的过程以实战的形式写一个专题,以此来学习和巩固这些 ...

  7. [ABC126E] 1 or 2

    2023-01-07 题目 题目传送门 翻译 翻译 难度&重要性(1~10):2 题目来源 AtCoder 题目算法 并查集 解题思路 因为每张卡片上的数字只能是 \(1\) 或者 \(2\) ...

  8. 2023-08-22:请用go语言编写。给定一个长度为N的正数数组,还有一个正数K, 返回有多少子序列的最大公约数为K。 结果可能很大,对1000000007取模。 1 <= N <= 10^5, 1

    2023-08-22:请用go语言编写.给定一个长度为N的正数数组,还有一个正数K, 返回有多少子序列的最大公约数为K. 结果可能很大,对1000000007取模. 1 <= N <= 1 ...

  9. 三维模型OBJ格式轻量化压缩主要技术方法浅析

    三维模型OBJ格式轻量化压缩主要技术方法浅析   OBJ格式是一种常用的三维模型文件格式,它以文本形式保存了模型的顶点.纹理坐标和法线信息.为了实现轻量化压缩,可以采用以下主要技术方法: 1.简化网格 ...

  10. vue3探索——组件通信之依赖注入

    背景 通常情况下,当我们需要从父组件向子组件传递数据时,会使用 props.想象一下这样的结构:有一些多层级嵌套的组件,形成了一颗巨大的组件树,而某个深层的子组件需要一个较远的祖先组件中的部分数据.在 ...