名前空間
変種
操作

論理演算子

提供: cppreference.com
< cpp‎ | language
 
 
C++言語
一般的なトピック
フロー制御
条件付き実行文
繰り返し文 (ループ)
ジャンプ文
関数
関数宣言
ラムダ関数宣言
inline 指定子
例外指定 (C++20未満)
noexcept 指定子 (C++11)
例外
名前空間
指定子
decltype (C++11)
auto (C++11)
alignas (C++11)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点
文字 - 文字列 - nullptr (C++11)
ユーザ定義 (C++11)
ユーティリティ
属性 (C++11)
typedef 宣言
型エイリアス宣言 (C++11)
キャスト
暗黙の変換 - 明示的な変換
static_cast - dynamic_cast
const_cast - reinterpret_cast
メモリ確保
クラス
クラス固有の関数特性
特別なメンバ関数
テンプレート
その他
 
一般
値カテゴリ (lvalue, rvalue, xvalue)
評価順序 (副作用完了点)
定数式
未評価式
一次式
ラムダ式(C++11)
リテラル
整数リテラル
浮動小数点リテラル
ブーリアンリテラル
文字リテラル および エスケープシーケンス
文字列リテラル
ヌルポインタリテラル(C++11)
ユーザ定義リテラル(C++11)
演算子
代入演算子: a=b, a+=b, a-=b, a*=b, a/=b, a%=b, a&=b, a|=b, a^=b, a<<=b, a>>=b
インクリメントとデクリメント: ++a, --a, a++, a--
算術演算子: +a, -a, a+b, a-b, a*b, a/b, a%b, ~a, a&b, a|b, a^b, a<<b, a>>b
論理演算子: a||b, a&&b, !a
比較演算子: a==b, a!=b, a<b, a>b, a<=b, a>=b, a<=>b(C++20)
メンバアクセス演算子: a[b], *a, &a, a->b, a.b, a->*b, a.*b
その他の演算子: a(...), a,b, a?b:c
デフォルト比較(C++20)
演算子の代替表現
優先順位と結合性
畳み込み式(C++17)
new 式
delete 式
throw 式
alignof
sizeof
sizeof...(C++11)
typeid
noexcept(C++11)
演算子オーバーロード
変換
暗黙の変換
const_cast
static_cast
reinterpret_cast
dynamic_cast
明示的な変換 (T)a, T(a)
ユーザ定義変換
 

ブーリアン演算の結果を返します。

演算子の名前 構文 オーバーロード可能 プロトタイプの例 (class T に対して)
クラス定義の内側 クラス定義の外側
否定 not a

!a

Yes bool T::operator!() const; bool operator!(const T &a);
論理積 a and b

a && b

Yes bool T::operator&&(const T2 &b) const; bool operator&&(const T &a, const T2 &b);
論理和 a or b

a || b

Yes bool T::operator||(const T2 &b) const; bool operator||(const T &a, const T2 &b);
ノート
  • キーワード的な形式 (andornot) と記号的な形式 (&&||!) は交換可能なものとして使用することができます (代替表現を参照してください)。
  • すべての組み込みの演算子は bool を返し、ほとんどのユーザ定義のオーバーロードも、組み込みのものと同じ方法で使用できるように、 bool を返します。 しかし、ユーザ定義の演算子オーバーロードでは、任意の型 (void を含む) を戻り値の型として使用できます。
  • 組み込みの演算子 && および || は短絡評価を行います (1つめの被演算子の評価で結果が判明した場合、2つめの被演算子を評価しません) が、オーバーロードされた演算子は普通の関数呼び出しのように動作し、常に両方の被演算子を評価します。

目次

[編集] 説明

論理演算子式は以下の形式を持ちます。

! rhs (1)
lhs && rhs (2)
lhs || rhs (3)
1) 論理否定。
2) 論理積。
3) 論理和。

被演算子が bool でない場合、それは bool への文脈的な変換を用いて bool に変換されます。 これは何らかの架空の一時変数 t について宣言 bool t(arg) が well-formed である場合にのみ well-formed です。

結果は bool の prvalue です。

組み込みの論理否定演算子の場合、被演算子が false であれば結果は true であり、そうでなければ結果は false です。

組み込みの論理積演算子の場合、被演算子が両方とも true であれば結果は true であり、そうでなければ結果は false です。 この被演算子は短絡評価を行います。 1つめの被演算子が false であれば2つめの被演算子は評価されません。

組み込みの論理和演算子の場合、いずれかの被演算子 (または両方) が true であれば結果は true です。 この演算子は短絡評価を行います。 1つめの被演算子が true であれば2つめの被演算子は評価されません。

ビット単位の論理演算子は短絡評価を行わないことに注意してください。

[編集] 結果

a true false
!a false true
&& a
true false
b true true false
false false false
|| a
true false
b true true true
false true false

ユーザ定義の演算子に対するオーバーロード解決では、以下の組み込み関数のシグネチャがオーバーロード解決に参加します。

bool operator!(bool)
bool operator&&(bool, bool)
bool operator||(bool, bool)

[編集]

#include <iostream>
#include <string>
int main()
{
    int n = 2;
    int* p = &n;
    // pointers are convertible to bool
    if(    p && *p == 2   // "*p" is safe to use after "p &&"
       || !p &&  n != 2 ) // || has lower precedence than &&
        std::cout << "true\n";
 
    // streams are also convertible to bool
    std::cout << "Enter 'quit' to quit.\n";
    for(std::string line;    std::cout << "> "
                          && std::getline(std::cin, line)
                          && line != "quit"; )
        ;
}

出力:

true
Enter 'quit' to quit.
> test
> quit

[編集] 標準ライブラリ

operator&& および operator|| の短絡評価の性質がオーバーロードに適用されないため、およびブーリアンのセマンティクスを持つ型が一般的でないため、これらの演算子をオーバーロードする標準ライブラリのクラスは2つだけです。

valarray の各要素に単項算術演算子を適用します
(std::valarrayのパブリックメンバ関数)
2つの valarray の各要素、または valarray と値に、二項演算子を適用します
(関数テンプレート)
エラーが発生したかどうか調べます (fail() の同義語です)
(std::basic_iosのパブリックメンバ関数) [edit]

[編集] 関連項目

演算子の優先順位

演算子オーバーロード

一般的な演算子
代入 インクリメント
デクリメント
算術 論理 比較 メンバアクセス その他

a = b
a += b
a -= b
a *= b
a /= b
a %= b
a &= b
a |= b
a ^= b
a <<= b
a >>= b

++a
--a
a++
a--

+a
-a
a + b
a - b
a * b
a / b
a % b
~a
a & b
a | b
a ^ b
a << b
a >> b

!a
a && b
a || b

a == b
a != b
a < b
a > b
a <= b
a >= b
a <=> b

a[b]
*a
&a
a->b
a.b
a->*b
a.*b

a(...)
a, b
? :

特殊な演算子

static_cast は型を別の関連する型に変換します。
dynamic_cast は継承階層内で変換します。
const_castcv 修飾子を追加または削除します。
reinterpret_cast は型を無関係の型に変換します。
C スタイルのキャストstatic_cast, const_cast, reinterpret_cast の混合によって型を別の型に変換します。
new は動的記憶域期間を持つオブジェクトを作成します。
delete は以前に new 式によって作成されたオブジェクトを破棄し、取得したメモリ領域を解放します。
sizeof は型のサイズを照会します。
sizeof...パラメータパックのサイズを照会します。 (C++11以上)
typeid は型の型情報を照会します。
noexcept は式が例外を投げることができるかどうかを調べます。 (C++11以上)
alignof は型のアライメント要件を照会します。 (C++11以上)

論理演算子C言語リファレンス