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();
}
}
コンパイラはこう解釈するのでプログラマの意図と違います。
参考:
https://www.jpcert.or.jp/sc-rules/c-exp19-c.html
http://www.kouno.jp/home/c_faq/c17.html#1
Linuxカーネル コーディング規約 1つの文しか実行しないところに、必要のない波括弧を使わないでください。
https://linuxjf.osdn.jp/JFdocs/kernel-docs-2.6/CodingStyle.html