goto語句——慎用,但是可以用


最近使用了goto語句,是因為if嵌套太深了,因此把錯誤處理同意了,直接使用goto語句。

舉例:

 

#include <stdio.h>

int main ()
{

    /* local variable definition */

    int a = 10;

    /* do loop execution */
    if (1)
    {
        do
        {
            if ( a == 15)
            {
                /* skip the iteration */
                a = a + 1;
                goto LOOP;
            }
            printf("value of a: %d\n", a);
            a++;
        }
        while ( a < 20 );

LOOP:
        printf("aa: %d\n", a);
        printf("loop: %d\n", a);
        a  = 4;
        printf("a = %d\n", a);
    }

    return 0;

}

 

  

 

多層嵌套里踹出去,或者有選擇的退到第幾層,這時候用goto是沒毛病的,label寫的明白點就行。注意不要鑽來鑽去,僅用於可控層數的break和continue,跳你就跳到某層循環結尾(大continue),或者緊貼在某層循環結束之后(大break)。另外記得用RAII保護資源不要泄露。對這種場景goto是最優解,該goto你就goto,用各種其他語法來“重新實現goto”是毫無意義的,只會比goto繁瑣、更不可讀,而且沒有收益。比如說原本一個完整的算法核心邏輯,可能就那么幾十行,需要goto跳幾個循環的,你給搞成狀態機、搞好幾個只會用一次的函數,再來幾個變量傳遞狀態,你說你干嘛呢,好好一段代碼被你搞成個迷宮,就為了不寫“goto”?

造成這個現象的原因是C/C艹沒有控制層數的break和continue,用goto是在實現這個缺失的功能。

其他場景下一般沒必要用goto。

結論分析及優缺點

goto 語句可用於跳出深嵌套循環
goto語句可以往后跳,也可以往前跳,且一直往前執行

goto只能在函數體內跳轉,不能跳到函數體外的函數。即goto有局部作用域,需要在同一個棧內。 

goto 語句標號由一個有效地標識符和符號";"組成,其中,標識符的命名規則與變量名稱相同,即由字母、數字和下划線組成,且第一個字符必須是字母或下划線。執行goto語句后,程序就會跳轉到語句標號處,並執行其后的語句。
通常goto語句與if條件語句連用,但是,goto語句在給程序帶來靈活性的同時,也會使得使程序結構層次不清,而且不易讀,所以要合理運用該語句。

參考:https://www.askpure.com/course_TGESH6E1-XRQR2I14-9XPX7Q53-KDBES2UV.html

https://zhuanlan.zhihu.com/p/33780928

https://www.cnblogs.com/oxspirt/p/7485873.html

https://www.zhihu.com/question/27922046


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM