草庐IT

C语言中goto的用法:

云小逸 2024-03-30 原文

目录

前言

1.goto语句的缺点:

2.goto语句的结构:

3.goto语句的用法:


前言

goto语句其实在平常中我们 除了学习分支语句和循环语句时,介绍循环语句时,才会知道有goto语句这个用法,那读者可能会问:我们还有学习的必要吗?

答案是显而易见的,正如黑格尔所说的:存在即合理!既然存在,就会有存在的必要!虽然我们现在不会遇到且用到 ,当在搞Linux硬件驱动等的时候,其内核含有较多的goto语句,如果不会且不知道的话,将会导致你无法理解这个的工作原理。因此我们要知道并学会用于它。

1.goto语句的缺点:

之所以老师没有多强调它,以及各大教科书几乎都是寥寥数笔,因为它有一个致命的缺点:一旦滥用goto语句将会导致逻辑混乱,导致系统崩溃等问题!!!

2.goto语句的结构:

again:
      语句;
    goto again;//again可以替换成其他的,这里不要求一定是again

3.goto语句的用法:

某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过 程。比如结束多层嵌套的使用

for(...)
    for(...)
   {
        for(...)
       {
            if(disaster)
                goto error;
       }
   }
    …
error:
 if(disaster)
         // 处理错误情况

在举一个具体例子便于你的理解:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<Windows.h>
int main(void)
{
	char input[20] = {0};
	system("shutdown -s -t 60");//表示将在60秒后电脑关机
again:
	printf("请注意:你的电脑将在60秒后自动关机,如果输入:不要关机,则取消自动关机\n");
	scanf("%s", input);
	if (strcmp(input,"不要关机") == 0)
	{
		system("shutdown -a");
	}
	else
		goto again;
	return 0;
}

 当然对于自己打字有信心,可以将60改为10,试一试(*^▽^*)

有关C语言中goto的用法:的更多相关文章

  1. ruby - 有人可以解释一下在 Ruby 中注入(inject)的真实、通俗易懂的用法吗? - 2

    我正在学习Ruby,遇到了inject。我正处于理解它的风口浪尖,但当我是那种需要真实世界的例子来学习一些东西的人时。我遇到的最常见的例子是人们使用inject来添加一个(1..10)范围的总和,我不太关心这个。这是一个任意的例子。在实际程序中我会用它做什么?我正在学习,所以我可以继续使用Rails,但我不必有一个以Web为中心的示例。我只需要一些我可以全神贯注的目标。谢谢大家。 最佳答案 inject有时可以通过它的“其他”名称reduce更好地理解。它是一个对Enumerable进行操作(迭代一次)并返回单个值的函数。它有许多有

  2. ruby - 使用法拉第上传文件 - 2

    我在尝试使用Faraday将文件上传到网络服务时遇到问题。我的代码:conn=Faraday.new('http://myapi')do|f|f.request:multipartendpayload={:file=>Faraday::UploadIO.new('...','image/jpeg')}conn.post('/',payload)尝试发布后似乎没有任何反应。当我检查响应时this是我所看到的:#:post,:body=>#,#,@opts={}>,#],@index=0>>,#>],@ios=[#,#,@opts={}>,#],@index=0>,#],@index=0>

  3. ruby - rspec: raise_error 用法来匹配错误信息 - 2

    我使用raise(ConfigurationError.new(msg))引发错误我试着用rspec测试一下:expect{Base.configuration.username}.toraise_error(ConfigurationError,message)但这行不通。我该如何测试呢?目标是匹配message。 最佳答案 您可以使用正则表达式匹配错误消息:it{expect{Foo.bar}.toraise_error(NoMethodError,/private/)}这将检查NoMethodError是否由privateme

  4. 【ChatGPT】ChatGPT 的 N 种用法 - 2

    目录ChatGPT简介技术原理应用未来发展ChatGPT的10 种用法ChatGPT简介ChatGPT是一种基于深度学习的大型语言模型,由OpenAI公司开发。技术原理GPT是GenerativePre-trainedTransformer的缩写,意为生成式预训练变压器。它的技术原理是使用了一个基于注意力机制的变压器(Trans

  5. ruby - 这在 Ruby 语言中是什么意思? - 2

    运行下面的代码,a=[1,2,3,4,5]head,*tail=apheadptail你会得到结果1[2,3,4,5]谁能帮我解释一下语句head,*tail=a,谢谢! 最佳答案 head,*tail=a表示将数组a的第一个元素赋值给head,其余元素赋值到尾部。*,有时称为“splat运算符”,可以对数组执行多种操作。当它位于赋值运算符(=)的左侧时,如您的示例所示,它仅表示“保留所有剩余内容”。如果您在该代码中省略了splat,它将改为执行以下操作:head,tail=[1,2,3,4,5]phead#=>1ptail#=>2

  6. ruby - 是否有 Rack::Session::Cookie 用法的基本示例? - 2

    我找不到任何使用Rack::Session::Cookie的简单示例,并且希望能够将信息存储在cookie中,并在以后的请求中访问它并让它过期.这些是我能找到的唯一示例:HowdoIset/getsessionvarsinaRackapp?http://rack.rubyforge.org/doc/classes/Rack/Session/Cookie.html这是我得到的:useRack::Session::Cookie,:key=>'rack.session',:domain=>'foo.com',:path=>'/',:expire_after=>2592000,:secret=

  7. python - 解释性语言中的链接和加载 - 2

    在编译型语言中,源代码由编译器转化为目标代码,不同的目标文件(如果有多个文件)由链接器链接并由加载器加载到内存中执行。如果我有一个使用解释性语言(例如ruby​​或python)编写的应用程序,并且如果源代码跨多个文件拆分,那么这些文件究竟何时组合在一起。换句话说,链接何时完成?解释型语言一开始就有链接器和加载器,还是解释器包揽一切?我真的很困惑,无法理解它!!谁能对此有所启发?! 最佳答案 解释型语言或多或少是可执行文件的大型配置,称为解释器。该可执行文件(例如/usr/bin/python)是实际运行的程序。然后它读取它要执行的

  8. ruby - Ruby 方法的双冒号(双列或::)语法的惯用用法 - 2

    我是Ruby的新手,发现以下几对令人困惑示例同样有效:File.included_modulesFile::included_modulesFile.stat('mbox')#Returnsa'#'objectFile::stat('mbox')File.new("foo.txt","w")File::new("foo.txt","w")"asdf".size#Aninstancemethod"asdf"::size2+32::send(:+,3)#AnextremeexampleFile::new,尤其是我经常遇到的东西。我的问题:如果我永远避免使用::运算符来限定除类、模块和常量之

  9. ruby - 如何在 Ruby 中实现 goto 和 label 方法? - 2

    作为DSL主题的作业,我需要用Ruby编写一个内联汇编程序。我知道TheJokeIsOnUs:HowRuby1.9SupportstheGotoStatement,但我不能使用它。这是一个非常简单的实现,汇编程序有四个寄存器-ax、bx、cx、dx,分别保存整数值,我可以对其进行一些操作,例如设置它们的值(mov)、比较两个寄存器(cmp)、递增寄存器(inc),跳转到一个特定的地方(jmp)和其他一些类似的。界面将是这样的:Asm.asmdomovcx,1jmpl1movax,1labell1movdx,1endjmp方法将接受标签名称或其他函数之一的序号。所以我的问题是:在bloc

  10. ruby - Ruby 语言中的快速排序 - 2

    我正在尝试在ruby​​中实现快速排序,但卡在如何在pivot的第一个分区之后递归调用。请帮助我了解如何进行,并让我知道到目前为止我的编码风格是否良好。classQuickSort$array=Array.new()$count=0defadd(val)#addingvaluestosorti=0whileval!='000'.to_i$array[i]=val.to_ii=i+1val=gets.to_iendenddeffirstsort_aka_divide(val1,val2,val3)#firstpartition$count=$count+1@pivot=val1@left

随机推荐