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. 如何编写难以维护的React代码?耦合组件

    如何编写难以维护的React代码?耦合组件 在许多项目中,我们经常会遇到一些难以维护的React代码.其中一种常见的情况是:子组件直接操作父组件方法,从而导致父子组件深度耦合.这样的实现让子组件过于依 ...

  2. React错误: Can't resolve 'react-dom/client'

    错误截图 解决方案 当你的react版本低于18时,但仍然报这个错误,可以采用如下方案 意外的发现当我采用上述方案时,我的React路由跳转时,页面不刷新的问题也解决了,很神奇,日后技艺精进再补充.

  3. sqlmap指定参数注入

    在参数前面加星号

  4. 常用c++ STL 汇总

    常用STL: vector 变长数组,倍增的思想 初始化: //初始化 vector<int> a; vector<int> a(n); vector<int> a ...

  5. js实现继承的五种方法及原型的继承关系

    继承是javascript中实现代码复用的一种方式,也能绑定对象或者函数之间的关系 为什么要继承 比如以下代码,Person.Student和Teacher构造函数,可以发现他们有一些特征 Perso ...

  6. 浏览器工作原理及V8引擎

    浏览器解析过程 当浏览器加载html资源时,会进行如下的解析过程 遇见 HTML 标记,构建 DOM 树 遇见 style/link 标记调用相应解析器处理CSS标记,并构建出CSS样式树 遇见 sc ...

  7. centos7关闭防火墙后只有22端口可以telnet的解决方法

    1.问题描述 防火墙已经关闭 22端口可以telnet 其他端口无法telnet 2.解决方法 注意:下列命令要用root账号/权限执行 2.1.开启防火墙 systemctl start firew ...

  8. cs50ai0----search

    cs50ai0-------Search cs50ai0-------Search 基础知识 课后题目 代码实践 学习链接 总结 基础知识 (1) search problem 上图是搜索问题的一般形 ...

  9. doris单机安装部署

    原文出处 doris单机安装部署 下载Doris 环境要求 Linux系统:Centos7.x或Ubantu16.04及以上版本 Java运行环境: JDK8 java -version 在windo ...

  10. 接口自动化测试项目 | IHRM登录接口自动化测试

    项目内容如下: ### 需求- 地址:http://ihrm-java.itheima.net/#/login- 测试接口: - 登录接口:针对登录的13个cases### 技术 - V1:pytho ...