擬似言語の論理演算(and・or・not)の読み方|複合条件で迷わないコツを解説
条件が and や or でつながった途端、何を聞かれているのか分からなくなる。
ifの中身が長くなると、目が滑ってしまいませんか?
条件が一つだけなら読めるのに、二つ三つと連なると急に難しく感じる。これは理解が足りないのではなく、読む順番を決めていないだけのことが多いです。
私はエンジニアとして10年以上、Webシステムの開発や運用に携わってきました。実務でも、条件をandでつなぐかorでつなぐかを一つ間違えただけで、本来通してはいけないデータが通ってしまう不具合が起きます。
だからこそ、この部分はゆっくり読む価値があります。この記事では、擬似言語の論理演算を三つだけに整理して、複合条件を落ち着いて追える形にしていきます。
論理演算は、条件を組み合わせる道具¶
まず、論理演算が何のためにあるのかを確認しましょう。ひとことで言えば、複数の条件をまとめて一つの答えにするための仕組みです。
たとえば、点数が60以上で、かつ出席回数が10回以上なら合格。この「かつ」を表すのが論理演算です。
条件そのものは難しくありません。難しく見えるのは、条件がつながったときに全体としてどうなるかを追えていないからです。
そこを押さえるために、まずは扱う値の話から始めます。
条件の答えは true か false のどちらか¶
擬似言語では、条件式の結果は必ず二つのうちどちらかになります。成り立つならtrue、成り立たないならfalseです。
この二つを論理型の値と呼びます。数値でも文字でもなく、真か偽かだけを表す値です。
たとえば x が5のとき、x > 3 は true になります。x = 10 は false です。
ここで大事なのは、条件式を見たら頭の中でtrueかfalseに置き換えるという習慣です。x > 3 という形のまま眺めていると、組み合わさったときに追えなくなります。
条件をいったん真偽に変換してしまえば、あとは真偽同士の計算になります。ここが今日いちばん伝えたいところです。
覚える演算子は三つだけ¶
論理演算子は、擬似言語では三つしか出てきません。and、or、notです。
andは論理積とも呼ばれ、両方が成り立つときだけtrueになります。orは論理和と呼ばれ、どちらか一方でも成り立てばtrueです。
notは否定で、trueとfalseを入れ替えます。trueの前に付ければfalse、falseの前に付ければtrueになります。
日本語に置き換えると、andは「かつ」、orは「または」、notは「〜でない」。この対応さえ持っておけば、問題文とコードを行き来できます。
真理値表で三つの動きを確かめる¶
言葉での説明だけだと、いざというときに自信が持てません。そこで、すべての組み合わせを一度書き出して確かめておきましょう。
条件Aと条件Bがそれぞれtrueかfalseになる場合の、四通りすべてを並べたものが次の表です。
| A | B | A and B | A or B | not A |
|---|---|---|---|---|
| true | true | true | true | false |
| true | false | false | true | false |
| false | true | false | true | false |
| false | false | false | false | true |
andの列を縦に見てください。trueになっているのは一行目だけです。
orの列は逆で、falseになっているのは最後の一行だけになります。両方ともfalseのときにだけ、全体がfalseになるということです。
この表は、覚えるというより作れるようになってほしいものです。試験本番でも、迷ったら余白に四行書けば必ず確かめられます。
三つ以上つながったときの考え方¶
実際の問題では、条件が三つ以上つながることもあります。そのときも、やることは同じです。
A and B and C なら、まずAとBを計算して、その結果とCをもう一度計算します。二つずつ処理していけば、いくつ並んでいても追えます。
andだけでつながっているなら、一つでもfalseがあった時点で全体はfalseです。orだけでつながっているなら、一つでもtrueがあれば全体はtrueになります。
この見方を持っておくと、長い条件式でも全部を計算せずに済む場面があります。時間の限られた試験では、これが地味に効いてきます。
とはいえ、andとorが混ざるときは順番が問題になります。次の章で扱うのはそこです。
条件分岐そのものの読み方に不安が残っている場合は、先にifの構造から確認しておくと理解が早くなります。
【関連記事】擬似言語のifで迷子になる人へ。擬似言語の条件分岐をスラスラ追う読み方
優先順位を知らないと読み違える¶
計算式に掛け算と足し算が混ざると、掛け算が先でした。論理演算にも、これと同じ決まりがあります。
擬似言語の演算子には優先順位が定められていて、上にあるものほど先に計算されます。整理すると次のとおりです。
| 優先順位 | 演算子 | 種類 |
|---|---|---|
| 1 | not、単項の +、- | 単項演算子 |
| 2 | mod、×、÷ | 乗除 |
| 3 | +、- | 加減 |
| 4 | ≠、≦、≧、<、=、> | 関係演算子 |
| 5 | and | 論理積 |
| 6 | or | 論理和 |
注目してほしいのは、関係演算子がandやorより上にあることです。つまり x > 3 and y < 5 は、比較を先に済ませてから、その真偽をandでつなぎます。
もう一つは、andがorより先に計算される点です。ここを知らないと、式の意味を取り違えます。
括弧を自分で補って読む¶
具体例で確かめましょう。A or B and C という式があったとします。
andが先なので、これは A or (B and C) と同じ意味になります。AとBを先にorでつないだ形ではありません。
読むときは、鉛筆で括弧を書き込んでしまうのが確実です。優先順位の高いところを括ってから、外側へ向かって処理していきます。
なお、問題文のコードにはじめから括弧が付いていることもよくあります。その場合は括弧が最優先なので、迷わず中から計算してください。
自分で条件を書くときも、括弧を付けておくほうが安全です。実務で私が書くコードでも、意味が一目で分かるように括弧を残すことが多くあります。
擬似言語のコードで動きを見る¶
ここまでの内容を、実際のコードで確かめてみましょう。ある値が範囲の中に入っているかを判定する処理です。
科目Bでも頻出の形なので、書き方ごと覚えてしまって構いません。
○整数型: judge(整数型: score, 整数型: days)
/* 点数が60以上100以下、かつ出席が10日以上なら合格 */
if ((score ≧ 60 and score ≦ 100) and days ≧ 10)
return 1 /* 合格 */
else
return 0 /* 不合格 */
endif
条件が三つ入っていますが、恐れることはありません。内側の括弧から順に真偽を出していけば、必ず答えは決まります。
たとえば score が75、days が12のときを追ってみましょう。score ≧ 60 はtrue、score ≦ 100 もtrue、days ≧ 10 もtrueです。
すべてtrueなので、andでつないだ全体もtrueになり、戻り値は1になります。
範囲の条件を or で書くと必ず壊れる¶
この形で、初心者がほぼ必ず一度は踏む間違いがあります。60以上100以下という範囲を、orでつないでしまうケースです。
score ≧ 60 or score ≦ 100 と書いたらどうなるか、確かめてみましょう。
score が200のとき、score ≧ 60 はtrueです。orは片方がtrueなら全体がtrueなので、この時点で条件が成立してしまいます。
つまり、どんな値を入れてもtrueになる条件が出来上がります。範囲を絞ったつもりが、何も絞れていないわけです。
範囲を挟み込みたいときはand。これは、そのまま覚えてしまって問題ありません。
逆に、範囲の外側を判定したいときはorを使います。score < 60 or score > 100 と書けば、範囲から外れた値だけを拾えます。
こうした条件の書き間違いは、見直しの段階で気づけるかどうかが分かれ目になります。確認の型を持っておくと安心です。
【関連記事】擬似言語でケアレスミスが多い人へ|よくある間違いと確認方法
not は条件をまるごとひっくり返す¶
三つ目のnotについても、もう少し詳しく見ておきます。notは、後ろに続く条件の真偽を反転させる演算子です。
not (x > 3) は、x が3より大きくない、つまり x ≦ 3 と同じ意味になります。
ここで一つ注意があります。not は不等号を単純に逆向きにするだけではありません。
x > 3 の否定は x < 3 ではなく、x ≦ 3 です。等しい場合を含めるかどうかを、うっかり落としてしまう人が多いところになります。
and と or は否定すると入れ替わる¶
もう一段だけ踏み込みます。andやorを含む条件をまるごと否定すると、andとorが入れ替わります。
not (A and B) は not A or not B と同じ。not (A or B) は not A and not B と同じになります。
言葉にすると納得しやすいはずです。両方成り立つわけではない、というのは、どちらか一方は成り立たない、という意味ですから。
この関係はド・モルガンの法則と呼ばれ、科目Aでも問われることがあります。名前より、真理値表で自分の手で確かめておくほうが本番で効きます。
先ほどの四行の表に not A、not B、not (A and B) の列を足して、値が一致するか見比べてみてください。納得感がまるで違ってきます。
手を動かして確かめると定着が早い¶
読んで分かった気になっても、自分でコードを追うとまた別の場所で詰まります。とくにandとorが混ざった式は、頭の中だけで処理しようとすると危険です。
Giji Academy の擬似言語シミュレーターでは、条件式を含むコードを一行ずつ実行しながら、変数の値と分岐の結果を確認できます。自分がtrueだと思った条件が本当にtrueだったか、その場で答え合わせができます。
まず自分で予想を立て、それから実行する。この順番を守ると、ずれた場所がはっきり見えます。よかったら学習ページから試してみてください。
変数の値を紙に書き出しながら追う方法と組み合わせると、さらに確実になります。
【関連記事】擬似言語のトレース表の書き方|科目Bで変数の値を追う手順を解説
よくあるつまずきと直し方¶
学習相談を受けていると、この分野では似たつまずきが繰り返し出てきます。まとめて確認しておきましょう。
自分がどれに当てはまるかを探しながら読んでみてください。
| つまずき | 起きること | 直し方 |
|---|---|---|
| 条件式を真偽に置き換えていない | 組み合わせを追えない | 先に各条件をtrue/falseにする |
| andとorを日本語で取り違える | 判定が逆になる | かつ=and、または=orで確認 |
| 優先順位を意識していない | 式の意味を読み違える | 括弧を自分で書き込む |
| 範囲の指定にorを使う | すべてtrueになる | 挟み込みはandと覚える |
| notで等号を落とす | 境界の値だけ誤る | 境界の値を1つ代入して試す |
一番多いのは、最後の行にある境界の間違いです。ちょうど60のときに合格になるのか、ならないのか。ここが問われる問題は本当によく出ます。
対策は単純で、境界の値を一つ入れて確かめること。それだけで防げます。
科目Bは20問を100分で解く試験です。一問に使える時間は限られていますが、条件式の確認は数秒で済みます。
その数秒を惜しまないほうが、結果として速く正解にたどり着けます。
まとめ¶
論理演算は、and、or、notの三つだけでした。それぞれ、かつ、または、〜でない、と読み替えられます。
迷ったら真理値表を書きましょう。四行書けば、答えは必ず確かめられます。
優先順位は、notが先、次にand、最後にorという順番です。andとorが混ざったら、括弧を自分で補ってから読み始めてください。
範囲を挟み込むときはand、範囲の外を拾うときはor。この使い分けを押さえておけば、条件式で大きく外すことはなくなります。
擬似言語の記号や書き方そのものに不安が残る場合は、早見表で全体を眺め直しておくと安心です。
【関連記事】擬似言語の記号・記述形式一覧|試験前のチェック早見表
条件が読めるようになると、繰返し処理の継続条件や、探索を打ち切る判断も同じ目線で追えるようになります。次に問題を開いたら、まず条件式を真偽に置き換えるところから始めてみてください。