if
文
プログラムの実際の作業は式によって実行されることを学んだ。これまで見てきたすべてのプログラムの式は、main()
関数で始まり、main
の終わりまで実行されていた。
一方、文は、式の実行に影響を与える機能だ。文は値を生成せず、それ自体には副作用もない。文は、式が実行されるかどうか、および実行される順序を決定する。文は、そのような決定を行う際に、論理式を使用する場合がある。
注釈:他のプログラミング言語では、式と文の定義が異なる場合や、その区別がまったくない場合もある。
if
ブロックとそのスコープ
if
文は、1つ以上の式が実行されるかどうかを決定する。これは、論理式を評価して決定する。これは、"コーヒーがあれば、私はコーヒーを飲む"という文の"if"と同じ意味だ。
if
は、括弧で囲まれた論理式を受け取る。その論理式の値がtrue
の場合、次の波括弧で囲まれた式が実行される。逆に、論理式がfalse
の場合、波括弧で囲まれた式は実行されない。
波括弧で囲まれた領域はスコープと呼ばれ、そのスコープ内のすべてのコードはコードブロックと呼ばれる。
if
文の構文は次の通りだ。
例えば、"コーヒーがあるならコーヒーを飲んで、カップを洗う"を表すプログラム構造は、次のプログラムのように記述できる。
existsCoffee
の値がfalse
の場合、ブロック内の式はスキップされ、プログラムは何も出力しない。
else
ブロックとそのスコープ
if
文の論理式がfalse
の場合に実行する操作がある場合がある。例えば、"コーヒーがあるならコーヒーを飲む、そうでない場合は紅茶を飲む"という決定では、常に実行する操作がある。
false
の場合に実行する操作は、else
キーワードの後のスコープに配置される。
例えば、常に紅茶があるとして、次のように記述する。
この例では、existsCoffee
の値に応じて、1番目の文字列か2番目の文字列のいずれかが表示される。
else
自体は文ではなく、if
文のオプションの節であり、単独では使用できない。
上記のif
およびelse
ブロックの波括弧の配置に注意。波括弧を別行に配置するのがD言語の公式スタイルだが、この本では、波括弧をインラインで配置する一般的なスタイルを統一して使っている。
スコープの波括弧は常に使用しよう
スコープ内に文が1つしかない場合は、中括弧を省略することも可能だが、お勧めはしない。if
とelse
のスコープには、それぞれ1つの文しか含まれていないため、このコードは次のように記述することもできる。
経験豊富なプログラマーは、単一の文でも中括弧を使用する。(この章の演習問題の一つは、中括弧を省略することに関するものだ。)そうは言っても、中括弧を省略した方が実際に良い唯一のケースを紹介しよう。
"if、else if、else"の連鎖
文や式の力の一つは、より複雑な方法でそれらを使用できることだ。式に加えて、スコープには他の文を含めることもできる。例えば、else
スコープにはif
文を含めることができる。文と式をさまざまな方法で接続することで、プログラムの目的に応じてインテリジェントに動作させることができる。
以下は、悪いコーヒーショップまで歩くよりも、良いコーヒーショップまで自転車で行くほうが望ましいという合意に基づいて、より複雑な例を書いたものだ。
上記のコードは、"コーヒーがある場合は自宅で飲む。そうでない場合、自転車がある場合は良い場所まで自転車で移動する。そうでない場合は悪い場所まで歩く"という文を表している。
この決定プロセスをさらに複雑にしよう:悪い場所まで歩く代わりに、まず隣を試しよう:
"この場合、そうでない場合は、さらに別の場合は、さらに別の場合は、..."という決定は、プログラムではよく見られる。残念ながら、中括弧を常に使用するというガイドラインを頑固に守ると、コードは横方向と縦方向に余白が多すぎるものになってしまう。空行を無視すると、上記の3つのif
文と4つのwriteln
式は、合計13行を占めている。
このような構文をよりコンパクトに記述するために、else
スコープにif
文が1つしか含まれていない場合、このガイドラインの例外として、そのelse
スコープの波括弧は省略する。
より良い形式を示す前の暫定的なステップとして、以下のコードは整理されていないままにしておく。このような整理されていない形でコードを書くべきではない。
単一のif
文のみを含む2つのelse
スコープの波括弧を削除したコードは、次のようになる。
ここで、これらのif
文を、それらを囲むelse
句と同じ行に移動し、コードを整理すると、より読みやすい次の形式になる。
中括弧を削除することで、コードがよりコンパクトになり、すべての式が整列して読みやすくなった。論理式、評価される順序、および真の場合に実行される操作が、一目でわかるようになった。
この一般的なプログラミング構文は"if、else if、else"の連鎖と呼ばれている。
演習
-
以下の論理式は
true
であるため、このプログラムはレモネードを飲み、カップを洗うことが予想される。 しかし、このプログラムを実行すると、皿も洗われてしまう:
なぜだろう?論理式がレモネードを飲む カップを洗う 皿を洗う
false
の場合にのみ皿を洗うようにプログラムを修正。 - ユーザーとゲームをするプログラムを書いてみよう(もちろん、信頼関係があるもの)。ユーザーはサイコロを投げ、その値を入力する。サイコロの値に応じて、ユーザーかプログラムが勝者となる。
サイコロの値 プログラムの出力 1 あなたの勝ち 2 あなたの勝ち 3 あなたの勝ち 4 私の勝ち 5 私の勝ち 6 私の勝ち それ以外の値 エラー: 無効な値 エラー: 7 は無効
- ユーザーに1から1000までの値を入力させるゲームに変更しよう。値が1から500の範囲であればユーザーが勝ち、501から1000の範囲であればコンピュータが勝つ。前のプログラムを、このように簡単に変更できるかな?