【C言語】
if文のセミコロンが多すぎても
コンパイルエラーにならない

セミコロン多すぎ

warning: suggest braces around empty body in an ‘if’ statement

警告:if文の中の空のボディを波括弧で囲むことを推奨します。
[-Wempty-body]


■一番小さいC言語の関数

void    f1(void)
{
}

何もしない関数でもコンパイルエラーになりません。

■空文だけでもエラーになりません

void    f2(void)
{
    ;//空文はコンパイルエラーにならない
}

■波括弧だけでもエラーになりません

void    f3(void)
{
    {   //波括弧のブロックはコンパイルエラーにならない
        ;
    }
}

■だからif 文直後のセミコロン;は。。。

int f4(int x)
{
    if(x);{
        return  1;  
    }
    return  0;
}

■コンパイルエラーになりません

int f5(int x)
{
    if(x)
        ;   //空文
    {   //波括弧のブロック
        return  1;  //必ず通過する 
    }
    return  0;  //ここには制御が来ない  
}

コンパイラは上記のように解釈して
コンパイルエラーを出しません。
if(x)は成立してもしなくても then 節が空文なので何もしません。

if(x)の判定結果と無関係に波括弧のブロック内の return 1 は必ず通過します。

プログラムとしては間違っていますが、文法的にはC言語規格に準拠していて問題がないのでコンパイルエラーになりません。

■セミコロンが多すぎる

int x,y;
int main(void)
{
    if(x);{     //NG: セミコロンが多すぎる
        ;
    }
    if(y){
        ;
    } else;{    //NG: セミコロンが多すぎる
        ;
    }
    do;while(1);{//NG: セミコロンが多すぎる
        ;
    } 
}

セミコロンが多すぎます。
if(x);は空のthen 節となり
コンパイルエラーにならないので
プログラマは気が付かない場合があります。

■for文直後もエラーにならない

int f6(int x)
{
    for(;x;)   ;   //空文
    {  
        x--;  
    }
    return  x;
}

似たような間違いに上記の for文直後のセミコロンがありますが、
これは gccでは -Wmisleading-indentation(-Wallに含まれている)で検出されます。

参考:

EXP15-C. if、for、while 文と同じ行にセミコロンを使用しない

https://www.jpcert.or.jp/sc-rules/c-exp15-c.html