首頁  >  文章  >  後端開發  >  c語言中goto語句的意思是什麼

c語言中goto語句的意思是什麼

青灯夜游
青灯夜游原創
2022-12-22 18:00:5515956瀏覽

在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 語句的前面或後面。

c語言中goto語句的意思是什麼

流程圖

c語言中goto語句的意思是什麼

#用法

首先,我們要確定好我們要轉移去的地方,也就是轉移終點,需要我們去設定一個標識符,也就是label(我沒有在秀英語,當goto語句出錯的時候,報錯內容很有可能會出現這個單字),同時,我們要在label後面加上一個冒號(:),就這樣,我們設定好了標識符,接下來我們設定起點-goto 標識符;。首先我們要告訴計算機,我們要跳了,就是goto的作用,接著我們要告訴他我們要跳去哪裡,也就是我們剛剛設定好的標識符,最後像是其他語句一樣,我們給它加分號(;),意指語句結束。下面是編輯器頁面的樣子。

c語言中goto語句的意思是什麼

以及運行結果

c語言中goto語句的意思是什麼

#可見,我們第5行printf沒有執行,直接來到了第7行printf。

它可以跳到後面語句,也可以跳到前面。

c語言中goto語句的意思是什麼

這樣他就變成了一個簡單的循環,沒有結束條件

c語言中goto語句的意思是什麼

大家可以試試看這段程式碼,當然我們可以用計數器加if判斷,給他一個結束條件,讓他擁有for和while的能力。

可惜的是我們沒辦法跨函數運用goto,有其他語句可以實現,我們在此不再贅述。

c語言中goto語句的意思是什麼

在這裡,如果if條件成立,我們在將它輸出之後,望著下面長長的一串層次不齊的中括號,我知道我要在他們在那裡設定條件,然後一遍又一遍的break,想想就煩,這時候不用goto更待何時?很快啊!我們直接一個goto,跳到了

c語言中goto語句的意思是什麼

去進行我們下一階段的程式。

但不知你是否注意到,我們在上一張圖片中,用了兩個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