搜索
首页后端开发C#.Net教程c语言中goto语句的含义是什么

c语言中goto语句的含义是什么

Dec 22, 2022 pm 06:00 PM
c语言goto

在c语言中,goto语句被称为无条件转移语句,允许把控制无条件转移到同一函数内的被标记的语句;语法“goto label;...label: statement;”,其中label可以是任何除C关键字以外的纯文本,它可以设置在C程序中goto语句的前面或者后面。

c语言中goto语句的含义是什么

本教程操作环境:windows7系统、c99版本、Dell G3电脑。

c语言 goto语句

goto语句,在C中又被称为无条件转移语句,说是无条件,其实还是有条件的,跳转范围还是有限制的,允许把控制无条件转移到同一函数内的被标记的语句。

语法

C 语言中 goto 语句的语法:

goto label;
..
.
label: statement;

在这里,label 可以是任何除 C 关键字以外的纯文本,它可以设置在 C 程序中 goto 语句的前面或者后面。

1.png

流程图

2.png

用法

首先,我们要确定好我们要转移去的地方,也就是转移终点,需要我们去设置一个标识符,也就是label(我没有在秀英语,当goto语句出错的时候,报错内容很有可能会出现这个单词),同时,我们要在label后面加一个冒号(:),就这样,我们设置好了标识符,接下来我们设置起点——goto 标识符;。首先我们要告诉计算机,我们要跳了,就是goto的作用,接着我们要告诉他我们要跳去哪里,也就是我们刚刚设置好的标识符,最后像是其他语句一样,我们给它加上分号(;),意味着语句结束。下面是编辑器页面的样子。

3.png

以及运行结果

4.png

可见,我们第5行printf没有执行,直接就来到了第7行printf。

它可以跳到后面语句,也可以跳到前面。

5.png

这样他就成了一个简便的循环,没有结束条件

6.png

大家可以试试跑一下这段代码,当然我们可以用计数器加if判断,给他一个结束条件,让他拥有for和while的能力。

可惜的是我们没办法跨函数运用goto,有其他语句可以实现,我们在此不再赘述。

7.png

在这里,如果if条件成立,我们在将它输出之后,望着下面长长的一串层次不齐的中括号,我知道我要在他们那里设置条件,然后一遍又一遍的break,想想就烦,这时候不用goto更待何时?很快啊!我们直接一个goto,跳到了

8.png

去进行我们下一阶段的程序。

但是不知你是否注意到,我们在上一张图片中,用了两个goto,却让他们指到了同一个label,是的,我们可以在不同的起点去让程序跳转到同一个终点,但是要注意的是我们不可以在同一个goto下跳到两个label,这很容易理解,换做是你,收到命令,叫你去两个甚至多个不同的地方,你也会懵逼,我到底该去哪。

另一个与之前不同的地方就是,我在标识符xiayige:的后面加上了一个分号(;),这是为什么?标识符的后面要跟一条语句才行,可以是赋值可以是声明,但是如果实在没有办法在他后面加语句,我们可以加一个分号,当作空语句,来让这个标识符运行起来。

Ps:其实可以在这里声明一个垃圾变量,或者别的什么无意义的语句,但会使代码变得不易懂,并不建议这么去做。

这是大家用goto做的最多的事,至于有什么其他的用法,那就要看你的想象力了,老话说得好,人有多大胆,地有多大产。

以下是我用到goto的时候。

#include<stdio.h>
int main ()
{
    printf("请输入要计算的算式,四则运算优先级一样高,从左到右依次计算\n");
    int jieguo=0,sz,gongju=0,gongju2=1;
    char ysf;
    scanf("%d",&jieguo);
    if (jieguo==0)
//直接输入等号的话%d似乎是0,有待商榷!!!!!!!!
//二次修改,if语句中判断量时只有0为假,除此之外的数字都表真
    {
    printf("**,你算**呢\n");
    goto chaojijieshu;
    gongju=1;
    gongju2=0;
    }
    else if (gongju2)
    
    {
    printf("请输入运算符\n");
    
    scanf(" %c",&ysf);
    //enter包含两个命令,算是两个字符\r和\n,后面的一个会占据scanf的输入位,所以要清空,或者用空格占位
    if(ysf==&#39;=&#39;)
    printf("**,你算**呢\n");
    }
loop:
    while(ysf!=&#39;=&#39;)
    {
        if (ysf==&#39;-&#39;)
        {
            printf("请输入数字\n");
            scanf("%d",&sz);
            jieguo-=sz;
            printf("请输入运算符\n");
            fflush(stdin);//清空标准输入流(stdin) fflush是stdio.h中的函数
            scanf("%c",&ysf);
            if(ysf==&#39;=&#39;)
            {
                goto jieshu;
            }
            else
            {
                goto loop;
            }
        }
        else if (ysf==&#39;+&#39;)
        {
            printf("请输入数字\n");
            scanf("%d",&sz);
            jieguo+=sz;
            printf("请输入运算符\n");
            fflush(stdin);//清空标准输入流(stdin) fflush是stdio.h中的函数
            scanf("%c",&ysf);
            if(ysf==&#39;=&#39;)
            {
                goto jieshu;
            }
            else
            {
                goto loop;
            }
        }
        else if(ysf==&#39;*&#39;)
        {
            printf("请输入数字\n");
            scanf("%d",&sz);
            jieguo*=sz;
            printf("请输入运算符\n");
            fflush(stdin);//清空标准输入流(stdin) fflush是stdio.h中的函数
            scanf("%c",&ysf);
            if(ysf==&#39;=&#39;)
            {
                goto jieshu;
            }
            else
            {
                goto loop;
            }        }
        else if(ysf==&#39;/&#39;)
        {
            printf("请输入数字\n");
            scanf("%d",&sz);
            while(sz==0)
            {
                printf("0能做分母吗?你算**呢\n");
            }
            jieguo/=sz;
            printf("请输入运算符\n");
            fflush(stdin);//清空标准输入流(stdin) fflush是stdio.h中的函数
            scanf("%c",&ysf);
            if(ysf==&#39;=&#39;)
            {
                goto jieshu;
            }
            else
            {
                goto loop;
            }
        }
    }
jieshu:
    printf("结果是%d\n",jieguo);
chaojijieshu:
    if (gongju)
    printf("真无语,重开吧\n");
    return 0;
    
}
//注意注意!!!!!!!!!!!!
//enter算是两个命令,所以有两个字符,在进行上一次输入之后
//在来一个enter,会占据scanf的字符位
//所以要清空标准输入流
//可以利用下述语句
//fflush(stdin);
//清空标准输入流(stdin) fflush是stdio.h中的函数
//以上是最好的解决办法
//初次之外,还有被称作偏方的办法
//二次修改 除此之外,而不是初次之外,打错字了
//如
//scanf(“ %c”,&ysf”)
//在scanf中加一个空格,可以顶掉enter多出来的一个字符
//还有
//加一句
//getchar()
//用getchar来捕捉多出来的\n

说明

在任何编程语言中,都不建议使用 goto 语句。因为它使得程序的控制流难以跟踪,使程序难以理解和难以修改。任何使用 goto 语句的程序可以改写成不需要使用 goto 语句的写法。

不推荐使用goto语句的原因:

①由于goto语句是无条件跳转指令,使用goto语句后回使得程序结构变得更加复杂,不利于以后代码维护,特别是需要交交接给被人维护的时候。

②由于目前编程采用的都是结构化编程,方便移植,而当采用goto语句后就会导致在结构化编程的项目中代码不便移植,因为如果使用goto从一个结构中跳转到另一个结构,而使得结构之间有了联系,不便移植。

③由于目前C语言等高级语言具有break、continue等语法,可以很好地代替goto,所以能不使用goto就不使用goto。

推荐使用goto的场景:

①从多重循环中直接跳出。

②出错时清除资源。

③可增加程序清晰度的情况。

使用goto函数的原则:

①使用goto语句只能goto到同一函数内,而不能从一个函数里goto到另外一个函数里。

②使用goto语句在同一函数内进行goto时,goto的起点应是函数内一段小功能的结束处,goto的目的label处应是函数内另外一段小功能的开始处,不能破坏功能的实现。

③不能从一段复杂的执行状态中的位置goto到另外一个位置,比如,从多重嵌套的循环判断中跳出去就是不允许的。 

④应该避免向两个方向跳转。这样最容易导致"面条代码",即逻辑混乱。

相关推荐:《C视频教程

以上是c语言中goto语句的含义是什么的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
C#.NET生态系统:框架,库和工具C#.NET生态系统:框架,库和工具Apr 24, 2025 am 12:02 AM

C#.NET生态系统提供了丰富的框架和库,帮助开发者高效构建应用。1.ASP.NETCore用于构建高性能Web应用,2.EntityFrameworkCore用于数据库操作。通过理解这些工具的使用和最佳实践,开发者可以提高应用的质量和性能。

将C#.NET应用程序部署到Azure/AWS:逐步指南将C#.NET应用程序部署到Azure/AWS:逐步指南Apr 23, 2025 am 12:06 AM

如何将C#.NET应用部署到Azure或AWS?答案是使用AzureAppService和AWSElasticBeanstalk。1.在Azure上,使用AzureAppService和AzurePipelines自动化部署。2.在AWS上,使用AmazonElasticBeanstalk和AWSLambda实现部署和无服务器计算。

C#.NET:强大的编程语言简介C#.NET:强大的编程语言简介Apr 22, 2025 am 12:04 AM

C#和.NET的结合为开发者提供了强大的编程环境。1)C#支持多态性和异步编程,2).NET提供跨平台能力和并发处理机制,这使得它们在桌面、Web和移动应用开发中广泛应用。

.NET框架与C#:解码术语.NET框架与C#:解码术语Apr 21, 2025 am 12:05 AM

.NETFramework是一个软件框架,C#是一种编程语言。1..NETFramework提供库和服务,支持桌面、Web和移动应用开发。2.C#设计用于.NETFramework,支持现代编程功能。3..NETFramework通过CLR管理代码执行,C#代码编译成IL后由CLR运行。4.使用.NETFramework可快速开发应用,C#提供如LINQ的高级功能。5.常见错误包括类型转换和异步编程死锁,调试需用VisualStudio工具。

揭开c#.net的神秘面纱:初学者的概述揭开c#.net的神秘面纱:初学者的概述Apr 20, 2025 am 12:11 AM

C#是一种由微软开发的现代、面向对象的编程语言,.NET是微软提供的开发框架。C#结合了C 的性能和Java的简洁性,适用于构建各种应用程序。.NET框架支持多种语言,提供垃圾回收机制,简化内存管理。

C#和.NET运行时:它们如何一起工作C#和.NET运行时:它们如何一起工作Apr 19, 2025 am 12:04 AM

C#和.NET运行时紧密合作,赋予开发者高效、强大且跨平台的开发能力。1)C#是一种类型安全且面向对象的编程语言,旨在与.NET框架无缝集成。2).NET运行时管理C#代码的执行,提供垃圾回收、类型安全等服务,确保高效和跨平台运行。

C#.NET开发:入门的初学者指南C#.NET开发:入门的初学者指南Apr 18, 2025 am 12:17 AM

要开始C#.NET开发,你需要:1.了解C#的基础知识和.NET框架的核心概念;2.掌握变量、数据类型、控制结构、函数和类的基本概念;3.学习C#的高级特性,如LINQ和异步编程;4.熟悉常见错误的调试技巧和性能优化方法。通过这些步骤,你可以逐步深入C#.NET的世界,并编写高效的应用程序。

c#和.net:了解两者之间的关系c#和.net:了解两者之间的关系Apr 17, 2025 am 12:07 AM

C#和.NET的关系是密不可分的,但它们不是一回事。C#是一门编程语言,而.NET是一个开发平台。C#用于编写代码,编译成.NET的中间语言(IL),由.NET运行时(CLR)执行。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),