Logical operators
論理演算の結果を返します。
| 演算子名 | 構文 | オーバーロード可能 | プロトタイプ例 ( 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 ) ; |
|
||||
目次 |
説明
論理演算子の式は以下の形式を持ちます
!
rhs
|
(1) | ||||||||
lhs
&&
rhs
|
(2) | ||||||||
lhs
||
rhs
|
(3) | ||||||||
オペランドが
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 |
| and | a | ||
|---|---|---|---|
| true | false | ||
| b | true | true | false |
| false | false | false | |
| or | a | ||
|---|---|---|---|
| true | false | ||
| b | true | true | true |
| false | true | false | |
タグ内のテキスト、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
(クラステンプレート) |
| 一般的な演算子 | ||||||
|---|---|---|---|---|---|---|
| 代入 |
インクリメント
デクリメント |
算術 | 論理 | 比較 |
メンバー
アクセス |
その他 |
|
a
=
b
|
++
a
|
+
a
|
!
a
|
a
==
b
|
a
[
...
]
|
関数呼び出し
a ( ... ) |
|
カンマ
a, b |
||||||
|
条件演算子
a ? b : c |
||||||
| 特殊演算子 | ||||||
|
static_cast
関連する型間で変換を行う
|
||||||
|
C documentation
for
Logical operators
|
|
Cドキュメント
for
論理演算子
|