■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