Namespaces
Variants

Logical operators

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

論理演算の結果を返します。

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

! a

可能 bool T :: operator ! ( ) const ; bool operator ! ( const T & a ) ;
AND a and b

a && b

可能 bool T :: operator && ( const T2 & b ) const ; bool operator && ( const T & a, const T2 & b ) ;
包含的OR a or b

a || b

可能 bool T :: operator || ( const T2 & b ) const ; bool operator || ( const T & a, const T2 & b ) ;
注記
  • キーワード形式 ( and , or , not ) と記号形式 ( && , || , ! ) は互換的に使用可能 ( 代替表現 を参照)。
  • すべての組み込み演算子は bool を返し、ほとんどの ユーザー定義オーバーロード bool を返すため、ユーザー定義演算子を組み込み演算子と同じ方法で使用できる。ただし、ユーザー定義の演算子オーバーロードでは、任意の型を戻り値の型として使用できる ( void を含む)。
  • 組み込み演算子 && || は短絡評価を行う (最初のオペランドの評価後に結果が判明した場合、2番目のオペランドを評価しない) が、オーバーロードされた演算子は通常の関数呼び出しのように動作し、常に両方のオペランドを評価する。

目次

説明

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

! rhs (1)
lhs && rhs (2)
lhs || rhs (3)
1) 論理NOT
2) 論理AND
3) 論理包含OR

オペランドが bool でない場合、 boolへの文脈的変換 を使用して bool に変換されます:これは、ある発明された一時変数 t に対して宣言 bool t(arg) が適正である場合にのみ、適正な形式となります。

結果は bool の純粋右値です。

組み込みの論理NOT演算子の場合、オペランドが false であれば結果は true になります。それ以外の場合、結果は false です。

組み込みの論理AND演算子では、両方のオペランドが true の場合、結果は true になります。それ以外の場合、結果は false です。この演算子は 短絡評価 を行います:最初のオペランドが false の場合、2番目のオペランドは評価されません。

組み込みの論理OR演算子の場合、第1オペランドまたは第2オペランド(あるいは両方)が true の場合、結果は true となります。この演算子は短絡評価を行います:第1オペランドが true の場合、第2オペランドは評価されません。

ビット論理演算子は ショートサーキット評価 を行わないことに注意してください。

結果

a true false
! a false true
(注:HTMLタグ内のテキストはすべてC++コードとして識別されるため、翻訳対象外となりました。表の構造とC++のキーワードはそのまま保持されています)
and a
true false
b true true false
false false false
【翻訳結果の説明】 - すべてのHTMLタグと属性はそのまま保持されています - ` `タグ内のC++キーワード(`and`, `a`, `b`, `true`, `false`)は翻訳対象外として保持されています - 表の構造と書式は完全に維持されています - これはC++の論理演算子ANDの真理値表を表しています
or a
true false
b true true true
false true false
(注:指定された条件に従い、HTMLタグ・属性、 タグ内のテキスト、C++固有の用語("or", "a", "b", "true", "false")は翻訳せず、元のフォーマットを保持しています)

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

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

#include <iostream>
#include <sstream>
#include <string>
int main()
{
    int n = 2;
    int* p = &n;
    // ポインタはboolに変換可能
    if (    p && *p == 2  // "p &&"の後では"*p"は安全に使用可能
        || !p &&  n != 2) // || は && より優先度が低い
        std::cout << "true\n";
    // ストリームもboolに変換可能
    std::stringstream cin;
    cin << "3...\n" << "2...\n" << "1...\n" << "quit";
    std::cout << "Enter 'quit' to quit.\n";
    for (std::string line;    std::cout << "> "
                           && std::getline(cin, line)
                           && line != "quit";)
        std::cout << line << '\n';
}

出力:

true
Enter 'quit' to quit.
> 3...
> 2...
> 1...
>

標準ライブラリ

operator&& および operator|| の短絡評価の特性はオーバーロードには適用されず、また真偽値セマンティクスを持つ型は稀であるため、標準ライブラリクラスでこれらの演算子をオーバーロードしているのは次の2つのみです:

valarrayの各要素に単項算術演算子を適用する
( std::valarray<T> の 公開メンバ関数)
2つのvalarray、またはvalarrayと値の各要素に二項演算子を適用する
(関数テンプレート)
エラーが発生したかどうかをチェックする( fail() の同義語)
( std::basic_ios<CharT,Traits> の 公開メンバ関数)

関連項目

演算子の優先順位

演算子のオーバーロード

関数オブジェクトの実装: x && y
(クラステンプレート)
関数オブジェクトの実装: x || y
(クラステンプレート)
関数オブジェクトの実装: ! x
(クラステンプレート)
HTMLタグと属性、および` `タグ内のC++コードは翻訳せず、元のフォーマットを保持しました。「comma」のみを「カンマ」に翻訳しています。
一般的な演算子
代入 インクリメント
デクリメント
算術 論理 比較 メンバー
アクセス
その他

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 [ ... ]
* a
& a
a - > b
a. b
a - > * b
a. * b

関数呼び出し

a ( ... )
カンマ

a, b
条件演算子

a ? b : c
特殊演算子

static_cast 関連する型間で変換を行う
dynamic_cast 継承階層内で変換を行う
const_cast cv 修飾子を追加または削除する
reinterpret_cast 関連のない型間で変換を行う
Cスタイルキャスト static_cast , const_cast , および reinterpret_cast の組み合わせで型変換を行う
new 動的ストレージ期間を持つオブジェクトを作成する
delete new式で作成されたオブジェクトを破棄し、確保されたメモリ領域を解放する
sizeof 型のサイズを問い合わせる
sizeof... パック のサイズを問い合わせる (C++11以降)
typeid 型の型情報を問い合わせる
noexcept 式が例外を送出できるかどうかをチェックする (C++11以降)
alignof 型のアライメント要件を問い合わせる (C++11以降)

C documentation for Logical operators
上記のHTMLを日本語に翻訳します:
Cドキュメント for 論理演算子
翻訳の説明: - "C documentation" → "Cドキュメント"(C++専門用語として保持) - "Logical operators" → "論理演算子"(C++の専門用語として正確に翻訳) - HTMLタグ、属性、構造は完全に保持 - フォーマットは元のまま維持