c語言中goto語句的含義是什麼

2022-12-22 22:00:59

在c語言中,goto語句被稱為無條件轉移語句,允許把控制無條件轉移到同一函數內的被標記的語句;語法「goto label;...label: statement;」,其中label可以是任何除C關鍵字以外的純文字,它可以設定在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=='=')
    printf("**,你算**呢\n");
    }
loop:
    while(ysf!='=')
    {
        if (ysf=='-')
        {
            printf("請輸入數位\n");
            scanf("%d",&sz);
            jieguo-=sz;
            printf("請輸入運運算元\n");
            fflush(stdin);//清空標準輸入流(stdin) fflush是stdio.h中的函數
            scanf("%c",&ysf);
            if(ysf=='=')
            {
                goto jieshu;
            }
            else
            {
                goto loop;
            }
        }
        else if (ysf=='+')
        {
            printf("請輸入數位\n");
            scanf("%d",&sz);
            jieguo+=sz;
            printf("請輸入運運算元\n");
            fflush(stdin);//清空標準輸入流(stdin) fflush是stdio.h中的函數
            scanf("%c",&ysf);
            if(ysf=='=')
            {
                goto jieshu;
            }
            else
            {
                goto loop;
            }
        }
        else if(ysf=='*')
        {
            printf("請輸入數位\n");
            scanf("%d",&sz);
            jieguo*=sz;
            printf("請輸入運運算元\n");
            fflush(stdin);//清空標準輸入流(stdin) fflush是stdio.h中的函數
            scanf("%c",&ysf);
            if(ysf=='=')
            {
                goto jieshu;
            }
            else
            {
                goto loop;
            }        }
        else if(ysf=='/')
        {
            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=='=')
            {
                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語句的含義是什麼的詳細內容,更多請關注TW511.COM其它相關文章!