C言語のif文
#include <stdio.h> int main() { int i; i = 0; if ( i ) printf( "0 = true\n" ); else printf( "0 = false\n" ); i = 1; if ( i ) printf( "1 = true\n" ); else printf( "1 = false\n" ); i = -1; if ( i ) printf( "-1 = true\n" ); else printf( "-1 = false\n" ); return 0; }
C言語のif文は括弧内の式の値が0以外ならばthen節の文が実行されます。そして、括弧内の式の値が0で、else節があれば、else節の文が実行されます。
従って、以下のプログラムは、else節がないので何の文も実行しません。
i = 0; if ( i ) printf( "ここは表示されない\n" );
では、次のサンプル「何が表示される?」を実行すると、何が表示されるでしょうか?実行する前に考えて下さい。
//何が表示される? #include <stdio.h> int main() { int i; i = 0; if ( i != 0 ) if ( i >= 0 ) printf( "iは0以上。\n" ); else printf( "iは0\n" ); return 0; }
答えは・・・何も表示されません。「iは0」と表示されると考えた人が多いと思いますが、elseは最も内側のif文に対応するので、式「if >= 0」の判定結果がelaseの場合に「iは0」と表示されます。このプログラムは意図通り動作しないのです。
変数が0の時にメッセージを表示したい場合、サンプル「分かりやすい表示」で示す様に{}を付けます。
//分かりやすい表示 #include <stdio.h> int main() { int i; i = 0; if ( i != 0 ) { if ( i >= 0 ) printf( "iは0以上。\n" ); } else printf( "iは0\n" ); return 0; }
こうすれば「iは0」と表示されます。この教訓は、if文の入れ子がある場合、複合文を使用するべきです。{}をつけて、複合文にすれば誤読やミスを防げます。
他にもif文の落とし穴は存在します。次のサンプル「落とし穴」もよくある間違いです。
//落とし穴 #include <stdio.h> int main() { int i; i = 1; printf( "変数i = %d\n", i ); if ( i = 0 ) printf( "iは0\n" ); else printf( "iは0ではない\n" ); printf( "変数i = %d\n", i); return 0; }
サンプル「落とし穴」は、if文の式でi == 0 とするべき所を、i = 0としているので、変数の値が変えられています。比較するつもりで変数の値を変えてしまえば、以前の値に関係なく何らかの値が代入されるので、予期せぬバグが発生します。
これを避ける方法は、2つあります。1つめは、コンパイラオプションを指定して、警告をエラーとして扱う方法です。2つめは、比較値を左( if ( 0 = i ) printf( "iは0\n" );)にして、=を使うとコンパイルエラーを発生させる方法です。
if文の様に、単純な構文でもバグは潜んでいます。十分に注意しましょう。