分支语句与循环语句——特殊的goto语句

 goto语句

C语言中提供了可以随意滥用的goto语句和标记跳转的标号。

通常意义上来说,由于goto语句可以哪里都可以用;因此,goto语句可能会有一些破坏性的工作,一般建议大家不去使用。(如果没有更好的方案替代,一定要使用goto语句的情况除外

从理论上goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。

简单介绍一下goto语句:

int main(){

               again:

                    printf("hello\n");

                    goto again;

                     return 0;

}

这个代码的的意思是,程序一进入主函数之后,先不管again,先进行打印,来到goto again;后,再重新返回上面的again,程序再往下执行。

因此,会一直打印,陷入死循环。

goto语句——是跳到哪里去;

这里again其实是一个符号,意思是我放到哪里,goto就跳到哪里去。

在举例——

int main(){

                    printf("hello\n");

                    goto again;

                    printf("你好\n");

                 again:

                     printf("hehe\n");

                     return 0;

}

这个代码打印的结果是hello和hehe。

会发现goto语句跳过了“你好”打印的语句;所以,goto语句可以在我们的代码中随意乱跳

那这个时候,会容易让我们的代码的执行流程打乱;也就是说原本我们的代码是从上往下执行的,但如果遇到goto语句的话,就可能会跳到其他地方;这样跳来跳去的话,可能最后会导致最后连自己也不知道代码的执行逻辑。

goto语句会打乱我们程序原有的执行节奏,所以,我们特别在使用goto语句的时候会很容易写出bug;因此,建议大家以后在写代码的时候,尽量少用goto语句。

当然,这不是说goto语句一无是处,它也有自己应用的场景。

最常见的用法就是终止程序在某些深度嵌套的结构的处理过程,例如一次跳出两层或多层的循环。

如:

for(...)

   for(...)

  {

       for(...)

      {

           if(disaster)

               goto error;

      }

}

...

error:

if(disaster)

        // 处理错误情况

disaster——灾难。

在这三层循环中,如果来到遇到 if(disaster),灾难发生的话,就不能处理我们的逻辑,就去处理灾难去。

此时,如果没有goto语句,我们进入多次嵌套循环的内部的时候,遇到灾难时,想要返回处理,就要一直break返回上一次循环,且每一次的break都有自己的触发条件,这样会比较麻烦。

这时,就体现goto语句的重要性了,只要我们 if(disaster)后,goto error;就会跳出来,跳出来后,就可以在外部处理相应的错误情况

这个时候,就很容易跳处出嵌套的深层次的结构,这就是goto语句的天然使用。

goto语句的应用例子——一个关机程序

关机程序跑起来之后,电脑会在一分钟之后关机,如果我们在这一分钟之内输入想要的内容,就取消关机,怎么做?

如何用c语言来让电脑关机?

这里提供一个关机的命令——shutdown -s -t 60

意思是:-s设置关机;-t设置时间关机;60指60秒之后关机。

电脑中有一个cmd命令——command命令行,如果我们在这里输入shutdown -s -t 60后,电脑会在一分钟之后关机。

而取消的话,则是要输入——shutdown -a取消关机。

那该如何写c语言代码呢?

C语言提供一个函数——system()——执行系统命令的

system("shutdown -s -t 60");//执行让电脑在60秒之后关机的命令

只要代码执行这句话,那这句命令也就会开始执行。

之后,就是在后面在写一句提示,和用scanf来接收——

char input[20]={0};

 printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");

 scanf("%s", input);

之后,就需要判断所输入的内容是否一样,就需要比较字符串,如何比较呢?

这里就用到strcmp函数——用来比较字符串。

 if(strcmp(input, "我是猪")==0)

  {

       system("shutdown -a");

  }

   else

  {

       goto again;

  }

如果输入一样,就则取消关机;如果不一样,就再给机会。

此时,goto again;就会返回到again部分;如此反复,直至一分钟结束。

注:system函数的要有对应的头文件——#include<stdlib.h>;strcmp函数——#include<string.h>

所以——

#include <stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    char input[10] = {0};
    system("shutdown -s -t 60");
again:
    printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
    scanf("%s", input);
 if(0 == strcmp(input, "我是猪"))
   {
        system("shutdown -a");
   }
    else
   {
        goto again;
   }
    return 0;
}

这里,我们都说goto语句不建议使用,那能否在不使用goto语句的情况下,执行我们想要的关机代码呢?

用循环的方法解决。

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main()
{
    char input[10] = {0};
    system("shutdown -s -t 60");
    while(1)
   {
        printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
        scanf("%s", input);
        if(0 == strcmp(input, "我是猪"))
       {
            system("shutdown -a");
            break;
       }
   }
    return 0;
}

这里在提一点——

打开电脑里的服务,里面的任何一个服务程序都可以点起来,随便点一个,右击点属性,然后会看到有一个启动类型(有手动和自动)

我们任何一个在这里产生的服务,就是我们的可执行程序;而我们刚刚所写的关机程序也编成一个可执行程序(.exe文件就是可执行程序)

大家可以试着去搜索如何将可执行程序添加到服务里头(可以用命令的方式添加),而添加好之后,我们可以将启动类型改为自动,这样就意味着只要你操作系统执行起来,那么你的电脑就会在一分钟之内关机(操作系统执行起来就会把服务执行起来,而我们刚刚设置自动,那么就会执行)

这样,你的电脑开起来,就又会在一分钟之内关机;如此反复,就像中了病毒一样,这样就可以做一些有趣的事情(比如拿你朋友的电脑来试。)

但这只是建议,不推荐小白去做,到时搞不回来就完了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值