C++の論理演算子とは、条件の「真」または「偽」を判定したり、複数の条件を組み合わせたりするときに使う演算子です。
主に、条件分岐や繰り返し処理で使われます。
たとえば、「年齢が18歳以上で、なおかつチケットを持っている場合だけ入場できる」「管理者または編集者なら操作できる」「ログインしていない場合にメッセージを表示する」といった判定に使います。
C++でよく使う論理演算子は、次の3つです。
| 演算子 | 読み方 | 意味 |
|---|---|---|
&& | 論理AND | 両方の条件が真なら真 |
| ` | ` | |
! | 論理NOT | 真偽を反転する |
論理演算子は、比較演算子と組み合わせて使われることが多いです。
たとえば、「年齢が18歳以上」「点数が80点以上」「ログイン済みである」といった条件を、さらに組み合わせて判定できます。
論理AND「&&」
&&の意味
&& は、複数の条件を「かつ」でつなぐ演算子です。
左側の条件と右側の条件が、どちらも真の場合にだけ、全体の結果が真になります。
たとえば、次のような条件を考えます。
「18歳以上で、なおかつチケットを持っている」
この場合、年齢条件だけを満たしていても不十分です。
チケットを持っているだけでも不十分です。
両方の条件を満たした場合にだけ、条件全体が成立します。
&&の真理値
&& の結果は、次のようになります。
| 条件A | 条件B | 条件A && 条件B |
|---|---|---|
| 真 | 真 | 真 |
| 真 | 偽 | 偽 |
| 偽 | 真 | 偽 |
| 偽 | 偽 | 偽 |
つまり、&& はかなり厳しい条件です。
すべての条件が成立している必要があります。
&&がよく使われる場面
&& は、複数の条件をすべて満たしているかを確認したいときに使います。
たとえば、次のような場面です。
| 判定したい内容 | 条件の考え方 |
|---|---|
| 18歳以上かつ会員である | 年齢条件と会員条件の両方が必要 |
| 点数が0点以上かつ100点以下 | 下限と上限の両方を満たす必要がある |
| ログイン済みかつ権限がある | ログイン状態と権限の両方が必要 |
| 在庫があり、かつ購入可能である | 在庫条件と購入条件の両方が必要 |
特に、範囲チェックでは && がよく使われます。
たとえば、「点数が0以上100以下である」という条件は、「0以上である」かつ「100以下である」という2つの条件を組み合わせて表現します。
論理OR「||」
||の意味
|| は、複数の条件を「または」でつなぐ演算子です。
左側の条件と右側の条件のうち、どちらか一方でも真であれば、全体の結果は真になります。
たとえば、次のような条件を考えます。
「管理者である、または編集者である」
この場合、管理者であれば条件は成立します。
編集者であっても条件は成立します。
両方に該当していても、もちろん成立します。
ただし、どちらにも該当しない場合は、条件全体が偽になります。
||の真理値
|| の結果は、次のようになります。
| 条件A | 条件B | 条件A || 条件B |
|---|---|---|
| 真 | 真 | 真 |
| 真 | 偽 | 真 |
| 偽 | 真 | 真 |
| 偽 | 偽 | 偽 |
|| は、&& と比べると条件がゆるいです。
どれか1つでも成立していれば、全体が成立します。
||がよく使われる場面
|| は、複数の条件のうち、どれか1つでも満たせばよい場合に使います。
たとえば、次のような場面です。
| 判定したい内容 | 条件の考え方 |
|---|---|
| 管理者または編集者である | どちらかの権限があればよい |
| 土曜日または日曜日である | どちらかの日であれば週末 |
| クーポンを持っている、または会員である | どちらかの条件で割引できる |
| エラーAまたはエラーBが発生している | どちらかのエラーがあれば処理する |
|| は、許可条件や例外条件を表すときによく使われます。
論理NOT「!」
!の意味
! は、条件の真偽を反転する演算子です。
真であれば偽にし、偽であれば真にします。
つまり、「〜ではない」という意味を表します。
たとえば、「ログインしていない場合」「有効ではない場合」「空ではない場合」などを表すときに使います。
!の真理値
! の結果は、次のようになります。
| 条件 | !条件 |
|---|---|
| 真 | 偽 |
| 偽 | 真 |
! は、条件を否定したいときに使います。
!がよく使われる場面
! は、状態を否定して判定したいときに便利です。
たとえば、次のような場面です。
| 判定したい内容 | 考え方 |
|---|---|
| ログインしていない | ログイン済みではない |
| 入力が空ではない | 空である、を否定する |
| 有効ではない | 有効である、を否定する |
| 禁止されていない | 禁止状態を否定する |
ただし、! を使いすぎると条件式が読みにくくなることがあります。
特に、否定の否定のような形になると、意味を理解しにくくなります。
そのため、条件が複雑な場合は、変数名や条件の書き方を工夫した方がよいです。
C++では数値も真偽値として扱える
0は偽、0以外は真
C++では、bool 型の値だけでなく、数値も条件として扱えます。
基本的なルールは次の通りです。
| 値 | 真偽 |
|---|---|
0 | 偽 |
0以外 | 真 |
つまり、整数の 0 は偽として扱われます。
一方、1、-1、10 など、0 以外の数値は真として扱われます。
数値を条件に使うときの注意点
C++では数値をそのまま条件に使えますが、初心者のうちは明確に比較した方が読みやすい場合があります。
たとえば、「値が0ではない」ことを判定したい場合、数値をそのまま条件にすることもできます。
しかし、読みやすさを重視するなら、「0ではない」と明示した方が意図が伝わりやすくなります。
特に学習段階では、条件の意味が一目でわかる書き方を意識するとよいです。
論理演算子と比較演算子の関係
比較演算子と組み合わせて使うことが多い
論理演算子は、比較演算子と組み合わせて使われることが非常に多いです。
C++でよく使う比較演算子には、次のようなものがあります。
| 演算子 | 意味 |
|---|---|
== | 等しい |
!= | 等しくない |
< | より小さい |
> | より大きい |
<= | 以下 |
>= | 以上 |
これらの比較演算子で作った条件を、&& や || で組み合わせることで、より複雑な条件を表現できます。
範囲チェックでの使い方
たとえば、「点数が0点以上100点以下である」という条件は、次の2つに分けて考えられます。
| 条件 | 意味 |
|---|---|
| 点数が0以上 | 下限を満たしている |
| 点数が100以下 | 上限を満たしている |
この2つの条件を両方満たす必要があるため、論理ANDを使います。
一方、「土曜日または日曜日である」という条件では、どちらか一方に当てはまればよいため、論理ORを使います。
論理演算子の結果はbool型になる
結果は真または偽
C++の論理演算子の結果は、基本的に bool 型です。
bool 型は、真を表す true と、偽を表す false のどちらかを持つ型です。
たとえば、比較演算の結果も bool 型になります。
「10は20より小さい」という比較は真なので、結果は true です。
「10は20より大きい」という比較は偽なので、結果は false です。
表示すると1または0になることがある
C++では、bool 型の値をそのまま出力すると、標準では true が 1、false が 0 と表示されます。
これはC++の仕様上、自然な動作です。
ただし、設定を変えることで true や false という文字で表示することもできます。
学習中に結果を確認するときは、1 が真、0 が偽を表していると覚えておくとよいです。
短絡評価とは
短絡評価の意味
C++の && と || には、短絡評価という重要な仕組みがあります。
短絡評価とは、左側の条件だけで全体の結果が決まる場合、右側の条件を評価しない仕組みです。
これは、C++の論理演算子を理解するうえで非常に重要です。
&&の短絡評価
&& は、両方の条件が真でなければ全体が真になりません。
そのため、左側の条件が偽だった時点で、全体の結果は偽に決まります。
この場合、右側の条件は評価されません。
たとえば、「値が0ではない、かつ、その値で割り算しても問題ない」という条件を考える場合、先に「0ではない」ことを確認することで、危険な処理を避けられます。
左側で安全確認を行い、右側で実際の判定を行う、という使い方ができます。
||の短絡評価
|| は、どちらか一方でも真であれば全体が真になります。
そのため、左側の条件が真だった時点で、全体の結果は真に決まります。
この場合、右側の条件は評価されません。
たとえば、「管理者である、または特別な権限を持っている」という条件で、左側の「管理者である」が真なら、右側の条件を確認しなくてもアクセス可能と判断できます。
短絡評価が重要な理由
短絡評価は、単に処理を省略するためだけの仕組みではありません。
安全なプログラムを書くうえでも重要です。
たとえば、ポインタが有効かどうかを先に確認してから、そのポインタの中身を使うような場面があります。
このとき、左側で安全確認を行い、右側で中身を参照することで、無効な値を扱うリスクを避けられます。
また、時間のかかる処理や関数呼び出しを、必要な場合だけ実行する目的でも使われます。
論理演算子の優先順位
基本的な優先順位
C++の演算子には、評価される順番があります。
論理演算子に関係する主な優先順位は、ざっくり次のように理解するとよいです。
| 優先順位 | 演算子 | 意味 |
|---|---|---|
| 高い | ! | 否定 |
| 中 | 比較演算子 | 大小比較や等価比較 |
| 低 | && | 論理AND |
| さらに低い | ` |
特に重要なのは、&& は || よりも優先順位が高いという点です。
&&と||を混ぜるときの注意
&& と || を同じ条件式の中で使うと、意図しない判定になることがあります。
たとえば、「管理者、または、編集者でログイン済み」という条件と、「管理者または編集者で、かつログイン済み」という条件は意味が違います。
前者では、管理者ならログイン状態に関係なく条件が成立する可能性があります。
後者では、管理者であっても編集者であっても、ログインしていなければ条件は成立しません。
このように、括弧の位置によって意味が大きく変わります。
複雑な条件では括弧を使う
C++の優先順位を正しく覚えていても、複雑な条件式は読み間違えやすいです。
そのため、&& と || を混ぜる場合は、括弧を使って意図を明確にするのがおすすめです。
括弧を使うことで、プログラムを書いた本人だけでなく、あとから読む人にも条件の意味が伝わりやすくなります。
よくある間違い
&&と&を間違える
C++には、&& と & があります。
見た目は似ていますが、意味は異なります。
| 演算子 | 主な意味 |
|---|---|
&& | 論理AND |
& | ビットAND |
通常の条件判定では、&& を使います。
& は主にビット演算で使う演算子です。
また、bool に対して使える場合もありますが、&& と違って短絡評価をしません。
そのため、条件式で誤って & を使うと、右側の条件まで必ず評価されてしまい、思わぬエラーや不具合につながることがあります。
特に、右側の条件に割り算やポインタ参照、関数呼び出しなどが含まれる場合は注意が必要です。
||と|を間違える
同じように、|| と | も間違えやすい演算子です。
| 演算子 | 主な意味 |
|---|---|
| ` | |
| ` | ` |
通常の条件判定では、|| を使います。
| は主にビット演算で使います。
bool に対して使える場合もありますが、|| と違って短絡評価をしません。
そのため、「どちらか一方が真ならよい」という条件を書きたい場合は、基本的に || を使うと覚えておくとよいです。
=と==を間違える
C++初心者が特によく間違えるのが、= と == の違いです。
| 演算子 | 意味 |
|---|---|
= | 代入 |
== | 等しいかどうかの比較 |
= は値を入れるための演算子です。
一方、== は左右の値が等しいかどうかを判定する演算子です。
条件式の中で等しいかどうかを調べたい場合は、== を使います。
誤って = を使うと、比較ではなく代入になってしまいます。
その結果、本来意図していない条件判定になることがあります。
ド・モルガンの法則
ド・モルガンの法則とは
論理演算では、条件の否定を書き換えるための法則があります。
これをド・モルガンの法則といいます。
考え方は次の2つです。
| 元の条件 | 書き換え後 |
|---|---|
| AかつBではない | Aではない、またはBではない |
| AまたはBではない | Aではない、かつBではない |
少し抽象的に見えますが、実際の条件式を読みやすくするために役立ちます。
条件を読みやすくするために使える
たとえば、「18歳以上かつチケットを持っている、という条件を満たさない場合」を考えます。
この条件は、次のように言い換えられます。
「18歳未満、またはチケットを持っていない場合」
このように書き換えると、条件の意味が直感的にわかりやすくなることがあります。
ただし、すべての条件を無理にド・モルガンの法則で書き換える必要はありません。
大切なのは、読みやすく、誤解しにくい条件にすることです。
論理演算子を使うときの考え方
条件を日本語で整理する
複雑な条件を書く前に、まず日本語で条件を整理するとわかりやすくなります。
たとえば、次のように考えます。
「ユーザーがログインしていて、かつ管理者である場合に表示する」
この場合は、2つの条件を両方満たす必要があるため、論理ANDを使います。
一方で、
「管理者または編集者であれば表示する」
この場合は、どちらか一方を満たせばよいため、論理ORを使います。
条件を分解して考える
条件が複雑になる場合は、いきなり1つの条件式にまとめようとしない方がよいです。
まず、条件を小さく分解します。
たとえば、「商品を購入できる条件」を考える場合、次のように分けられます。
| 条件 | 内容 |
|---|---|
| 在庫がある | 商品が売り切れていない |
| ログインしている | ユーザーが認証済み |
| 支払い方法が有効 | 決済できる状態 |
| 購入制限に引っかかっていない | 購入不可条件を満たしていない |
このように分解してから、それぞれを && や || で組み合わせると、条件式を作りやすくなります。
否定条件を増やしすぎない
! は便利ですが、否定が多くなると読みにくくなります。
たとえば、「無効ではない」「禁止されていない」「空ではない」といった条件が重なると、読み手が意味を理解するのに時間がかかります。
その場合は、条件名や変数名を工夫して、肯定形で読めるようにするとわかりやすくなります。
実務で読みやすい条件を書くコツ
複雑な条件では括弧を使う
演算子の優先順位に頼りすぎると、条件式が読みにくくなります。
特に、&& と || が混在する場合は、括弧を使って意図を明確にするのがおすすめです。
括弧を使うことで、どの条件がひとまとまりなのかがわかりやすくなります。
条件の意味がわかる名前を使う
条件を変数に分ける場合は、意味が伝わる名前を使うことが大切です。
たとえば、次のような名前は条件の意味がわかりやすいです。
| 名前の例 | 意味 |
|---|---|
isLoggedIn | ログインしている |
isAdmin | 管理者である |
hasPermission | 権限を持っている |
isValid | 有効である |
isEmpty | 空である |
canEnter | 入場できる |
canPurchase | 購入できる |
このような名前を使うと、条件式が読みやすくなります。
安全確認を先に書く
短絡評価を活用する場合は、安全確認を左側に置くことが大切です。
たとえば、ある値が有効かどうかを先に確認してから、その値を使うようにします。
&& の場合、左側が偽なら右側は評価されません。
そのため、左側に安全確認、右側に実際の判定を書くと、安全で読みやすい条件になります。
より正確に理解するための補足
「1以上99以下」と「0より大きく100より小さい」は厳密には違う
条件式で「0より大きく100より小さい」と書いた場合、整数だけを扱うなら、結果的に「1以上99以下」と同じ意味になります。
しかし、小数を扱う場合は違います。
たとえば、0.5や99.9のような値も、「0より大きく100より小さい」という条件を満たします。
そのため、説明としては「0より大きく100より小さい」と書く方が正確です。
整数であることが明らかな場合にだけ、「1以上99以下」と説明できます。
boolへの入力は0または1が基本
C++で bool 型に入力する場合、基本的には 0 または 1 を使います。
| 入力 | 扱われ方 |
|---|---|
0 | 偽 |
1 | 真 |
通常の設定では、文字としての true や false をそのまま入力するわけではありません。
true や false という文字で入力したい場合は、別途その形式で読み取る設定が必要です。
初心者向けのプログラムでは、「1ならはい、0ならいいえ」のように案内するとわかりやすいです。
using namespace std;は学習用ではよく使われる
C++の入門コードでは、using namespace std; がよく使われます。
これは間違いではありません。
ただし、大きなプログラムや実務コードでは、名前の衝突を避けるために、標準ライブラリの名前を明示して書くことも多いです。
学習初期はわかりやすさを優先して問題ありませんが、慣れてきたら、より実務的な書き方にも触れていくとよいです。
まとめ
C++の論理演算子は、条件判定を組み合わせるために使う重要な演算子です。
| 演算子 | 意味 | 成立する条件 |
|---|---|---|
&& | 論理AND | すべての条件が真 |
| ` | ` | |
! | 論理NOT | 真偽を反転する |
特に重要なのは、次のポイントです。
| ポイント | 内容 |
|---|---|
&& | 複数の条件をすべて満たす必要がある |
| ` | |
! | 条件の真偽を反転する |
| 短絡評価 | 結果が確定したら右側を評価しない |
| 優先順位 | !、比較演算子、&&、` |
| 括弧 | 複雑な条件では括弧を使って意味を明確にする |
| 注意点 | && と &、` |
C++の論理演算子は、文法そのものはシンプルです。
しかし、短絡評価や優先順位、否定条件の読みやすさまで意識すると、より安全でわかりやすいコードを書けるようになります。
初心者のうちは、条件を日本語で整理してから、&&、||、! のどれを使うべきか考えるのがおすすめです。
以上、C++の論理演算子についてでした。
最後までお読みいただき、ありがとうございました。
