【C言語】
continueを禁止した場合と使った場合の比較
-深いネストは良くない-

■この記事の概要

C言語におけるcontinue文の使用と非使用を比較し、コードの可読性やメンテナンス性の違いを解説します。

この記事は、MISRA-C基準でのcontinue使用の歴史と、現代のC言語での推奨パターンを初心者向けに紹介します。


continueを禁止して深いネストにした場合(非推奨)

#include <stdio.h>
#include <stdlib.h>

int main(void){
    char *input = "/usr/include/stdio.h";
    FILE *fp = fopen(input,"r");
    if(fp == NULL){
        perror(NULL);
        exit(-1);
    }
    char    buf[BUFSIZ];
    while(fgets(buf,BUFSIZ,fp) != NULL){
        if(buf[0] != '\n'){
            if(buf[0] != '#'){
                if(buf[0] != '/'){
                    printf("%s",buf);//メイン処理
                }
                else
                {
                    ;//何もしない
                }
            }
            else
            {
                ;//何もしない
            }
        }
        else
        {
            ;//何もしない
        }
    }
    fclose(fp);
}

古いMISRA-Cルールはcontinueを禁止していたので
メイン処理がネストの深い所に記述されていました。
ネストが深いのでこのルールを守るとコードが
読みづらくなります。


■continueを使って浅いネストにした場合(推奨)

#include <stdio.h>
#include <stdlib.h>

int main(void){
    char *input = "/usr/include/stdio.h";
    FILE *fp = fopen(input,"r");
    if(fp == NULL){
        perror(NULL);
        exit(-1);
    }
    char    buf[BUFSIZ];
    while(fgets(buf,BUFSIZ,fp) != NULL){
        if(buf[0] == '\n'){
            continue ;
        }
        if(buf[0] == '#'){
            continue ;
        }
        if(buf[0] == '/'){
            continue ;
        }
        printf("%s",buf);//メイン処理
    }
    fclose(fp);
}

幸いな事にMISRA-Cのcontinue 禁止は廃案になったので
今はcontinueを禁止するメジャールールはありません。

continueを使うとメイン処理を
深いネストの所ではなく
下に書けます。
つまりプログラムの流れを上から下へ書く事ができるので
読みやすくなります。

参考:
MISRA-C:2012 ルール一覧