溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

c語(yǔ)言中g(shù)oto語(yǔ)句怎么使用

發(fā)布時(shí)間:2022-12-27 09:04:22 來(lái)源:億速云 閱讀:496 作者:iii 欄目:編程語(yǔ)言

這篇文章主要介紹“c語(yǔ)言中g(shù)oto語(yǔ)句怎么使用”,在日常操作中,相信很多人在c語(yǔ)言中g(shù)oto語(yǔ)句怎么使用問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”c語(yǔ)言中g(shù)oto語(yǔ)句怎么使用”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

在c語(yǔ)言中,goto語(yǔ)句被稱(chēng)為無(wú)條件轉(zhuǎn)移語(yǔ)句,允許把控制無(wú)條件轉(zhuǎn)移到同一函數(shù)內(nèi)的被標(biāo)記的語(yǔ)句;語(yǔ)法“goto label;...label: statement;”,其中l(wèi)abel可以是任何除C關(guān)鍵字以外的純文本,它可以設(shè)置在C程序中g(shù)oto語(yǔ)句的前面或者后面。

c語(yǔ)言 goto語(yǔ)句

goto語(yǔ)句,在C中又被稱(chēng)為無(wú)條件轉(zhuǎn)移語(yǔ)句,說(shuō)是無(wú)條件,其實(shí)還是有條件的,跳轉(zhuǎn)范圍還是有限制的,允許把控制無(wú)條件轉(zhuǎn)移到同一函數(shù)內(nèi)的被標(biāo)記的語(yǔ)句。

語(yǔ)法

C 語(yǔ)言中 goto 語(yǔ)句的語(yǔ)法:

goto label;
..
.
label: statement;

在這里,label 可以是任何除 C 關(guān)鍵字以外的純文本,它可以設(shè)置在 C 程序中 goto 語(yǔ)句的前面或者后面。

c語(yǔ)言中g(shù)oto語(yǔ)句怎么使用

流程圖

c語(yǔ)言中g(shù)oto語(yǔ)句怎么使用

用法

首先,我們要確定好我們要轉(zhuǎn)移去的地方,也就是轉(zhuǎn)移終點(diǎn),需要我們?nèi)ピO(shè)置一個(gè)標(biāo)識(shí)符,也就是label(我沒(méi)有在秀英語(yǔ),當(dāng)goto語(yǔ)句出錯(cuò)的時(shí)候,報(bào)錯(cuò)內(nèi)容很有可能會(huì)出現(xiàn)這個(gè)單詞),同時(shí),我們要在label后面加一個(gè)冒號(hào)(:),就這樣,我們?cè)O(shè)置好了標(biāo)識(shí)符,接下來(lái)我們?cè)O(shè)置起點(diǎn)——goto 標(biāo)識(shí)符;。首先我們要告訴計(jì)算機(jī),我們要跳了,就是goto的作用,接著我們要告訴他我們要跳去哪里,也就是我們剛剛設(shè)置好的標(biāo)識(shí)符,最后像是其他語(yǔ)句一樣,我們給它加上分號(hào)(;),意味著語(yǔ)句結(jié)束。下面是編輯器頁(yè)面的樣子。

c語(yǔ)言中g(shù)oto語(yǔ)句怎么使用

以及運(yùn)行結(jié)果

c語(yǔ)言中g(shù)oto語(yǔ)句怎么使用

可見(jiàn),我們第5行printf沒(méi)有執(zhí)行,直接就來(lái)到了第7行printf。

它可以跳到后面語(yǔ)句,也可以跳到前面。

c語(yǔ)言中g(shù)oto語(yǔ)句怎么使用

這樣他就成了一個(gè)簡(jiǎn)便的循環(huán),沒(méi)有結(jié)束條件

c語(yǔ)言中g(shù)oto語(yǔ)句怎么使用

大家可以試試跑一下這段代碼,當(dāng)然我們可以用計(jì)數(shù)器加if判斷,給他一個(gè)結(jié)束條件,讓他擁有for和while的能力。

可惜的是我們沒(méi)辦法跨函數(shù)運(yùn)用goto,有其他語(yǔ)句可以實(shí)現(xiàn),我們?cè)诖瞬辉儋樖觥?/p>

c語(yǔ)言中g(shù)oto語(yǔ)句怎么使用

在這里,如果if條件成立,我們?cè)趯⑺敵鲋?,望著下面長(zhǎng)長(zhǎng)的一串層次不齊的中括號(hào),我知道我要在他們那里設(shè)置條件,然后一遍又一遍的break,想想就煩,這時(shí)候不用goto更待何時(shí)?很快??!我們直接一個(gè)goto,跳到了

c語(yǔ)言中g(shù)oto語(yǔ)句怎么使用

去進(jìn)行我們下一階段的程序。

但是不知你是否注意到,我們?cè)谏弦粡垐D片中,用了兩個(gè)goto,卻讓他們指到了同一個(gè)label,是的,我們可以在不同的起點(diǎn)去讓程序跳轉(zhuǎn)到同一個(gè)終點(diǎn),但是要注意的是我們不可以在同一個(gè)goto下跳到兩個(gè)label,這很容易理解,換做是你,收到命令,叫你去兩個(gè)甚至多個(gè)不同的地方,你也會(huì)懵逼,我到底該去哪。

另一個(gè)與之前不同的地方就是,我在標(biāo)識(shí)符xiayige:的后面加上了一個(gè)分號(hào)(;),這是為什么?標(biāo)識(shí)符的后面要跟一條語(yǔ)句才行,可以是賦值可以是聲明,但是如果實(shí)在沒(méi)有辦法在他后面加語(yǔ)句,我們可以加一個(gè)分號(hào),當(dāng)作空語(yǔ)句,來(lái)讓這個(gè)標(biāo)識(shí)符運(yùn)行起來(lái)。

Ps:其實(shí)可以在這里聲明一個(gè)垃圾變量,或者別的什么無(wú)意義的語(yǔ)句,但會(huì)使代碼變得不易懂,并不建議這么去做。

以下是我用到goto的時(shí)候。

#include<stdio.h>
int main ()
{
    printf("請(qǐng)輸入要計(jì)算的算式,四則運(yùn)算優(yōu)先級(jí)一樣高,從左到右依次計(jì)算\n");
    int jieguo=0,sz,gongju=0,gongju2=1;
    char ysf;
    scanf("%d",&jieguo);
    if (jieguo==0)
//直接輸入等號(hào)的話(huà)%d似乎是0,有待商榷?。。。。。。?!
//二次修改,if語(yǔ)句中判斷量時(shí)只有0為假,除此之外的數(shù)字都表真
    {
    printf("**,你算**呢\n");
    goto chaojijieshu;
    gongju=1;
    gongju2=0;
    }
    else if (gongju2)
    
    {
    printf("請(qǐng)輸入運(yùn)算符\n");
    
    scanf(" %c",&ysf);
    //enter包含兩個(gè)命令,算是兩個(gè)字符\r和\n,后面的一個(gè)會(huì)占據(jù)scanf的輸入位,所以要清空,或者用空格占位
    if(ysf=='=')
    printf("**,你算**呢\n");
    }
loop:
    while(ysf!='=')
    {
        if (ysf=='-')
        {
            printf("請(qǐng)輸入數(shù)字\n");
            scanf("%d",&sz);
            jieguo-=sz;
            printf("請(qǐng)輸入運(yùn)算符\n");
            fflush(stdin);//清空標(biāo)準(zhǔn)輸入流(stdin) fflush是stdio.h中的函數(shù)
            scanf("%c",&ysf);
            if(ysf=='=')
            {
                goto jieshu;
            }
            else
            {
                goto loop;
            }
        }
        else if (ysf=='+')
        {
            printf("請(qǐng)輸入數(shù)字\n");
            scanf("%d",&sz);
            jieguo+=sz;
            printf("請(qǐng)輸入運(yùn)算符\n");
            fflush(stdin);//清空標(biāo)準(zhǔn)輸入流(stdin) fflush是stdio.h中的函數(shù)
            scanf("%c",&ysf);
            if(ysf=='=')
            {
                goto jieshu;
            }
            else
            {
                goto loop;
            }
        }
        else if(ysf=='*')
        {
            printf("請(qǐng)輸入數(shù)字\n");
            scanf("%d",&sz);
            jieguo*=sz;
            printf("請(qǐng)輸入運(yùn)算符\n");
            fflush(stdin);//清空標(biāo)準(zhǔn)輸入流(stdin) fflush是stdio.h中的函數(shù)
            scanf("%c",&ysf);
            if(ysf=='=')
            {
                goto jieshu;
            }
            else
            {
                goto loop;
            }        }
        else if(ysf=='/')
        {
            printf("請(qǐng)輸入數(shù)字\n");
            scanf("%d",&sz);
            while(sz==0)
            {
                printf("0能做分母嗎?你算**呢\n");
            }
            jieguo/=sz;
            printf("請(qǐng)輸入運(yùn)算符\n");
            fflush(stdin);//清空標(biāo)準(zhǔn)輸入流(stdin) fflush是stdio.h中的函數(shù)
            scanf("%c",&ysf);
            if(ysf=='=')
            {
                goto jieshu;
            }
            else
            {
                goto loop;
            }
        }
    }
jieshu:
    printf("結(jié)果是%d\n",jieguo);
chaojijieshu:
    if (gongju)
    printf("真無(wú)語(yǔ),重開(kāi)吧\n");
    return 0;
    
}
//注意注意!?。。。。。。。。。。?
//enter算是兩個(gè)命令,所以有兩個(gè)字符,在進(jìn)行上一次輸入之后
//在來(lái)一個(gè)enter,會(huì)占據(jù)scanf的字符位
//所以要清空標(biāo)準(zhǔn)輸入流
//可以利用下述語(yǔ)句
//fflush(stdin);
//清空標(biāo)準(zhǔn)輸入流(stdin) fflush是stdio.h中的函數(shù)
//以上是最好的解決辦法
//初次之外,還有被稱(chēng)作偏方的辦法
//二次修改 除此之外,而不是初次之外,打錯(cuò)字了
//如
//scanf(“ %c”,&ysf”)
//在scanf中加一個(gè)空格,可以頂?shù)鬳nter多出來(lái)的一個(gè)字符
//還有
//加一句
//getchar()
//用getchar來(lái)捕捉多出來(lái)的\n

說(shuō)明

在任何編程語(yǔ)言中,都不建議使用 goto 語(yǔ)句。因?yàn)樗沟贸绦虻目刂屏麟y以跟蹤,使程序難以理解和難以修改。任何使用 goto 語(yǔ)句的程序可以改寫(xiě)成不需要使用 goto 語(yǔ)句的寫(xiě)法。

不推薦使用goto語(yǔ)句的原因:

①由于goto語(yǔ)句是無(wú)條件跳轉(zhuǎn)指令,使用goto語(yǔ)句后回使得程序結(jié)構(gòu)變得更加復(fù)雜,不利于以后代碼維護(hù),特別是需要交交接給被人維護(hù)的時(shí)候。

②由于目前編程采用的都是結(jié)構(gòu)化編程,方便移植,而當(dāng)采用goto語(yǔ)句后就會(huì)導(dǎo)致在結(jié)構(gòu)化編程的項(xiàng)目中代碼不便移植,因?yàn)槿绻褂胓oto從一個(gè)結(jié)構(gòu)中跳轉(zhuǎn)到另一個(gè)結(jié)構(gòu),而使得結(jié)構(gòu)之間有了聯(lián)系,不便移植。

③由于目前C語(yǔ)言等高級(jí)語(yǔ)言具有break、continue等語(yǔ)法,可以很好地代替goto,所以能不使用goto就不使用goto。

推薦使用goto的場(chǎng)景:

①?gòu)亩嘀匮h(huán)中直接跳出。

②出錯(cuò)時(shí)清除資源。

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

使用goto函數(shù)的原則:

①使用goto語(yǔ)句只能goto到同一函數(shù)內(nèi),而不能從一個(gè)函數(shù)里goto到另外一個(gè)函數(shù)里。

②使用goto語(yǔ)句在同一函數(shù)內(nèi)進(jìn)行g(shù)oto時(shí),goto的起點(diǎn)應(yīng)是函數(shù)內(nèi)一段小功能的結(jié)束處,goto的目的label處應(yīng)是函數(shù)內(nèi)另外一段小功能的開(kāi)始處,不能破壞功能的實(shí)現(xiàn)。

③不能從一段復(fù)雜的執(zhí)行狀態(tài)中的位置goto到另外一個(gè)位置,比如,從多重嵌套的循環(huán)判斷中跳出去就是不允許的?!?/p>

④應(yīng)該避免向兩個(gè)方向跳轉(zhuǎn)。這樣最容易導(dǎo)致"面條代碼",即邏輯混亂。

到此,關(guān)于“c語(yǔ)言中g(shù)oto語(yǔ)句怎么使用”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI