【C言語】
dangling-else
~宙ぶらりんのelseとは?~

warning: this ‘if’ clause does not guard…

警告:誤解を招く段落を避け{ }を付けよう
[-Wmisleading-indentation]


この記事の概要

この記事では、C言語における「ちゅうぶらりんのelse」(dangling-else)問題を解説しています。
波括弧を省略することで意図が不明確になるケースを取り上げ、警告メッセージの意味やコンパイラの解釈を説明。
意図を明確にするため、波括弧の使用を推奨しています。


■紛らわしい段落

#include    <stdio.h>
int main(int argc,char *argv[])
{
    if(argc == 1)               //ダメ:紛らわしい段落 {}が無い
        printf("if文の中");
        printf("if文の外");
        for(int i = 0 ;i < 10;i++)//ダメ:紛らわしい段落 {}が無い
            printf("for文の中");
            printf("for文の外");
            while(argc--);{     //ダメ:紛らわしいセミコロン    
                printf("while文の外");
            }
}

{}カッコが無いので意図したthen 節の中に入っていません。
上級者は本文が1行の時は{}カッコを省略する事もありますが、
一般的なプログラマは一律{}カッコを付ける事を推奨します。


■dangling-else

warning: suggest explicit braces to avoid ambiguous ‘else’

警告:あいまいな ‘else’ を避けるため、
波括弧を明示することをお勧めします。
[-Wdangling-else]

extern  void    OK(void);
extern  void    NG(void);
void f1(int x,int y)
{
    if(x == 0)
        if(y == 0)        
            OK() ;
    else    
        NG() ;
}

8行目のelseがどちらのif文にかかっているか
不明瞭になっています。
これをdangling-else(宙ぶらりんのelse)と言います。


■プログラマの意図

void f2(int x,int y)
{
    if(x == 0){
        if(y == 0) {    
            OK() ;
        }
    }else{    
        NG() ;
    }
}

プログラマの意図を明確にするため波括弧をつけよう。


■コンパイラの解釈

void f3(int x,int y)
{
    if(x == 0){
        if(y == 0) OK();
        else       NG();
    }
}

コンパイラはこう解釈するのでプログラマの意図と違います。

参考:

EXP19-C. if、for、while 文の本体は波括弧で囲む

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

C-FAQ 17.1: Cのコードの書き方で最良のものは。

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

Linuxカーネル コーディング規約 1つの文しか実行しないところに、必要のない波括弧を使わないでください。

https://linuxjf.osdn.jp/JFdocs/kernel-docs-2.6/CodingStyle.html