【C言語】
goto文を使う弊害より
使わぬ弊害が今は多い

邪悪な? goto文 正義の!

goto文の弊害

令和6年の現代ではgoto文を使う弊害より、
使わない弊害のほうが顕著です。

世界的に有名なコーディング規約である
MISRA-CやCERT-Cでも
goto文の効果的使い方が紹介されています。


■goto文を使うと分りやすい例

#include    <stdio.h>
#include    <string.h>
int room[10][10][10] = {[3][2][1]=1}; 
int main(void){
    int i,j,k;
    for(i=0;i<10;i++){
        for(j=0;j<10;j++){
            for(k=0;k<10;k++){
                if(room[i][j][k] != 0){
                    goto end;
                }
            }
        }
    }
    puts("使用中の部屋はありません");
    return  -1;
end:
    printf("部屋[%d][%d][%d]は使用中\n",i,j,k);
    return  0;
}

goto end;からend:ラベルまで
目線の動きは一直線で
単純明快わかりやすいです。


■goto文を禁止したわかりにくい例

#include    <stdio.h>
#include    <string.h>
int room[10][10][10] = {[3][2][1]=1}; 
int main(void){
    int     flag = 0;
    int i,j,k;
    for(i=0;i<10;i++){
        for(j=0;j<10;j++){
            for(k=0;k<10;k++){
                if(room[i][j][k] != 0){
                    flag = 1;
                    break;
                }
            }
            if(flag != 0){
                break;
            }
        }
        if(flag != 0){
            break;
        }
    }
    if(flag == 0){
        puts("使用中の部屋はありません");
        return  -1;
    }
    printf("部屋[%d][%d][%d]は使用中\n",i,j,k);
    return  0;
}

わかりやすいコードを書く目的が失われ、
ルールを守るのが目的になった
goto絶対禁止のプロジェクトでは

このようにフラグを多用した
難解なコードが書かれます。

■最新の世界的コーディング規約はgotoを禁止せず

MEM12-C. リソースの使用および解放の最中に発生するエラーが原因で関数を終了する場合に、Goto 連鎖の使用を検討する

https://swest.toppers.jp/SWEST16/data/s3d_proceeding.pdf#page=47

http://www.kouno.jp/home/c_faq/c17.html#10