
warning: this ‘if’ clause does not guard…
警告:誤解を招く段落を避け{ }を付けよう
[-Wmisleading-indentation]
■1.紛らわしい段落
#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行の時は{}カッコを省略する事もありますが、
一般的なプログラマは一律{}カッコを付ける事を推奨します。
■2.ちゅうぶらりんの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文にかかっているか
不明瞭になっています。
■3.プログラマの意図
void f2(int x,int y)
{
if(x == 0){
if(y == 0) {
OK() ;
}
}else{
NG() ;
}
}
プログラマの意図を明確にするため波括弧をつけよう。
■4.コンパイラの解釈
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