c-lang:if文
1. if ~ という書式
code:cpp
if (式)
<文>
もし、式(条件式ともいう)の値が真であったときは文を実行する。
式の値が偽ならば、何もしない。
2. if ~ else という書式
code:cpp
if (式)
<文 1>
else
<文 2>
もし、式の値が真であったときは文 1を実行する。
式の値が偽ならば文 2を実行する。
3. if ~ else if ~ ... else という書式
code:cpp
if (式 1)
<文 1>
else if (式 2)
<文 2>
else if (式 n)
<文 n>
else
<文 x>
もし、式 1の値が真であったときは文 1を実行する。
そうでなく、式 2の値が真ならば文 2を実行する。
そうでなく、式 nの値が真ならば文 nを実行する。
上のすべての条件にあてはまらない場合は、式 xを実行する。
if の書き方
長い条件式は複数行に分けて記述する。例えば、
code:cpp
if ( foo->next == NULL && totalcount > needed && needed >= MAX_ALLOT && server_active( current_input)) {
上記のような記述は
code:cpp
if ( foo->next == NULL
&& totalcount > needed
&& needed >= MAX_ALLOT
&& server_active( current_input))
{
の様に書く。
「&&」や「||」は、次の行の先頭に書いたほうが、条件式を変更し易い。
でも、なるべくなら、複雑な条件式は書かないようにしたほうがよい。
if 文が3重以上にネストする場合は、関数の分割など、他の手段を検討すべき。
通常発生する場合の処理は、if節に書く。
例外的な事象の処理は、else節に書く。
不等号を用いた条件判定において、等号が成立する場合の分岐が正しい ことを確認する。
条件判定部における代入文は特別な場合にのみ使用する。
else の書き方
if文が続けて二つ以上ある場合には、else 文の書き方には注意が必要である。 例えば次のような場合、
code:cpp
if ( are == FLAG)
if ( kore == NANIKA)
hogehoge();
else ( are > FLAG )
pekepeke();
else文は、if ( are == FLAG)に対応すると意図されているとしたら期待通りの動作をしない。
これは、else文がネストの一番深いif文に対応するためである。
このようなバグを出さないために、if文は必ず{}で囲む。
code:cpp
if ( are == FLAG) {
if ( kore == NANIKA) {
hogehoge();
}
} else ( are > FLAG ) {
pekepeke();
}
if-then-else-if 構造(多岐条件文)
条件判定の順序は、該当する頻度の高い順とする。
同一頻度と考えられ る場合には、アルファベット順など組織的な順序づけを行なう。
処理環境によっては、switch文で書くよりも、速度が早くなる場合がある。(その分、可読性は落ちる。)
条件判定において、すべての場合を尽くしていることを確認する。
switch文で書けるならば多岐条件文を使用しない。
入れ子のif文を使用する場合には、中括弧 {, } を使用して if と else の対応を明確にする。
長いif 文
多く分岐するとリストが見にくくなる。
最初に判断される条件と、最後に判断される条件で分岐する時間におおきな差がでる。
if 文のネストを深くしないコツ
エラー処理を先に書く。
code:cpp
if ( foo != 0) {
/* 正常処理 */
if ( bar != 0) {
/* 正常処理 */
if ( baz != 0) {
/* 正常処理 */
hgehoge();
} else {
/* エラー処理 */
return NG;
}
} else {
/* エラー処理 */
return NG;
}
} else {
/* エラー処理 */
return NG;
}
return OK;
よりも、
code:cpp
if ( foo == 0) {
/* エラー処理 */
return NG;
}
if ( bar == 0) {
/* エラー処理 */
return NG;
}
if ( baz == 0) {
/* エラー処理 */
return NG;
}
/* 正常処理 */
hgehoge();
return OK;
と書いた方が、ネストを不必要に深くしない。