論理式
プログラムが実行する実際の作業は、式によって行われる。値または副作用を生じるプログラムのあらゆる部分を式と呼ぶ。42
のような定数値や"hello"
も式である。これらは、それぞれ定数値42および"hello"を生成するからだ。
注釈:値を生成することと変数を定義することを混同しないでほしい。値は変数に関連付ける必要はない。
writeln
のような関数呼び出しも、副作用があるため式だ。writeln
の場合、その効果は、出力ストリームに文字が配置されることである。これまでに作成したプログラムからのもう1つの例は、左辺の変数に影響を与える代入演算だ。
式は値を生成するため、他の式の一部として使用することができる。これにより、より単純な式からより複雑な式を形成することができる。例えば、現在の気温の値を生成するcurrentTemperature
という関数があるとする。この関数が生成する値は、writeln
式で直接使用することができる。
この行は4つの式で構成されている。
"It's "
currentTemperature()
" degrees at the moment."
- 他の3つを使用する
writeln()
式
この章では、条件文で使用される特定の型の式について説明する。
しかし、先に進む前に、代入演算子をもう一度繰り返して、その左右にある2つの式に焦点を当てて説明しよう。代入演算子(=
)は、右側の式の値を左側の式(例えば変数)に代入する。
論理式
論理式は、ブール演算で使用される式だ。論理式は、"答えが"はい"の場合は、ファイルを保存する"といった、コンピュータプログラムが判断を行うためのものである。
論理式は、偽を表すfalse
と真を表すtrue
の2つの値しかとることができない。
以下の例では、writeln
の式を使用する。行の最後にtrue
と表示されている場合、その行に表示されている内容は真であることを意味する。同様に、false
は、その行の内容が偽であることを意味する。例えば、プログラムの出力結果が以下の場合
There is coffee: true
"コーヒーがある"という意味になる。同様に、
There is coffee: false
は"コーヒーはない"を意味する。私は"... is ...: false"という構文を"ではない"または"偽である"という意味で使用している。
論理式は、条件文、ループ、関数パラメータなどで広く使われている。その仕組みを理解することは不可欠だ。幸い、論理式は説明も使用も簡単だ。
論理式で使用される論理演算子は、次の通りだ。
-
==
演算子は、"等しいか?"という質問に答える。左側の式と右側の式を比較し、それらが等しい場合はtrue
、等しくない場合はfalse
を返す。定義により、==
が返す値は論理式である。例として、次の2つの変数があるとする。
以下は、これらの値を使用する2つの論理式である。
-
!=
演算子は、"等しくないか"という質問に答える。両側の2つの式を比較し、==
の反対の結果を生成する。 -
||
演算子は"または"を意味し、論理式のいずれかが真の場合、true
を生成する。左側の式の値が
true
の場合、右側の式を見もせずにtrue
を生成する。左側がfalse
の場合、右側の式の値を生成する。この演算子は、英語の"or"と似ている。左側、右側、またはその両方がtrue
の場合、true
を生成する。次の表は、この演算子の両側の可能な値と結果のすべてを示している。
左式 演算子 右式 結果 false || false false false || true true true || false (評価されない) true true || true (評価されない) true 2つの式の少なくとも1つが
true
であるため、上記の論理式はtrue
となる。 -
&&
演算子は"and"を意味し、両方の式が真の場合にtrue
を生成する。左側の式の値が
false
の場合、右側の式を見ずにfalse
を生成する。左側がtrue
の場合、右側の式の値を生成する。この演算子は、英語の"and"と似ている。左側の値と右側の値がtrue
の場合、true
を生成する。左式 演算子 右式 結果 false && false (評価されない) false false && true (評価されない) false true && false false true && true true 注釈:演算子
||
および&&
は、右側の式を評価しない場合があることを、短絡動作と呼ぶ 。後で説明する三項演算子?:
も、3つの式のうち1つも評価しないという点で同様だ。他の演算子は、常にすべての式を評価して使用する。 -
^
演算子は、"どちらか一方である"という質問に答える。この演算子は、1つの式だけがtrue
であり、両方がtrue
ではない場合に、true
を返す。警告:実際には、この演算子は論理演算子ではなく、算術演算子である。両方の式が
bool
の場合にのみ、論理演算子のように動作する。左式 演算子 右式 結果 false ^ false false false ^ true true true ^ false true true ^ true false 例えば、2人の友人のうち1人しか来なかった場合に私がチェスをするという論理は、次のようにコード化できる。
-
<
演算子は、"より小さいか?"(または"ソート順で先に来るか?")という質問に答える。 -
>
演算子は、"より大きい?"(または"ソート順で後にある?")という質問に答える。 -
<=
演算子は、"以下か?"(または"並べ替え順で先に来るか?")という質問に答える。この演算子は、>
演算子の逆である。 -
>=
演算子は、"より大きいか等しいか?"(または"並べ替え順で後か同じか?")という質問に答える。この演算子は、<
演算子の逆である。 -
!
演算子は、"の反対"を意味する。他の論理演算子とは異なり、1つの式のみを取り、その式がfalse
の場合はtrue
、その式がtrue
の場合はfalse
となる。
式のグループ化
式を評価する順序は、括弧を使って式をグループ化することで指定できる。より複雑な式に括弧で囲まれた式が含まれる場合、括弧で囲まれた式は、それらが含まれる式で使用される前に評価される。例えば、"コーヒーまたは紅茶があり、さらにクッキーまたはスコーンがあるなら、私は幸せだ"という式は、次のようにコード化できる。
サブ式が括弧で囲まれていない場合、式は Dの演算子の優先順位規則(C言語から継承)に基づいて評価される。この規則では、&&
は||
よりも優先順位が高いため、括弧で囲まないで式を記述すると、意図したとおりに評価されない。
&&
演算子が最初に評価され、式全体は次の式と意味的に同等になる。
これは全く異なる意味になる:"コーヒーがあるか、または紅茶とクッキー、またはスコーンがある場合、私は幸せだ"。
演算子の優先順位表は、この本の後半で説明する。
bool
の入力の読み取り
上記の bool
の値はすべて、自動的に "false"
または "true"
として自動的に表示される。逆の場合も同じで、readf()
は文字列を自動的に "false"
と "true"
を、それぞれfalse
およびtrue
というbool
値に変換する。小文字と大文字の任意の組み合わせも受け付ける。例えば、 "False"
と "FALSE"
はfalse
と "True"
は "TRUE"
はtrue
に変換される。
これは、bool
変数に読み込む場合のみに当てはまることに注意。それ以外の場合、string
変数に読み込むと、入力は変換されずにそのまま読み込まれる。(文字列の章で後で説明するように、文字列を読み込むときはreadln()
を使わなければいけない。)
演習
<
および>
演算子は、ある値が別の値よりも小さいか大きいかに応じて判断するために使用されることをこれまで見てきた。しかし、ある値が2つの値の間にあり、その2つの値のどちらにも属さないかを判断するための演算子は存在しない。プログラマーが、
value
が10と20の間にあるかどうかを判断する次のコードを書いたと仮定しよう。このコードは、このままではコンパイルできないことに注意しよう:式全体を括弧で囲んでみよう。
それでもコンパイルできないことに注意。
-
この問題の解決策を探しているうちに、同じプログラマーは、次のよう括弧を使用するとコードがコンパイルできることを発見した:
これで、プログラムは期待どおりに動作し、"true"と出力されるようになった。残念ながら、この出力はプログラムにバグがあるため、誤解を招くものである。このバグの影響を確認するには、15を20より大きい値に置き換えてみよう。
プログラムは、21が20未満ではないにもかかわらず、"true"と表示し続けることに注意。
ヒント:論理式の型は
bool
であることを思い出してみよう。bool
の値が20未満であるかどうかは意味がないはずだ。コンパイルできる理由は、コンパイラがブール式を1または0に変換し、それを20と比較して20未満であるかどうかを評価するためだ。 - "は、~の間にあるか?"という質問に答える論理式は、次のようにコーディングする必要がある。"下限値より大きく、上限値より小さいか?"
その論理に従ってプログラム内の式を変更し、期待どおり"true"と表示されることを確認。さらに、論理式が他の値でも正しく機能することをテスト。例えば、
value
が50または1の場合、プログラムは"false"と表示され、12の場合、プログラムは"true"と表示されるはずだ。 - 次の条件の1つが真の場合にビーチに行けるものと仮定しよう:
- ビーチまでの距離が10マイル未満で、全員分の自転車がある場合
- 私たちの人数が6人未満で、車があり、少なくとも1人が運転免許を持っている場合
このプログラムでは、常に"true"と表示される。上記の条件のいずれかが真の場合に"true"と表示される論理式を作成しよう。(プログラムを試すときは、"あるか"で始まる質問には"false"または"true"と入力)。
さまざまな値を入力して、作成した論理式が正しく動作することを確認しよう。