論理演算子
ブール演算の結果を返します。
| 演算子名 | 構文 | オーバーロード可能 | プロトタイプ例 (class T の場合) | |
|---|---|---|---|---|
| クラス定義内 | クラス定義外 | |||
| negation | 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 の prvalue です。
組み込みの論理NOT演算子の場合、オペランドが false であれば結果は true です。そうでなければ、結果は false です。
組み込みの論理AND演算子の場合、両方のオペランドが true であれば結果は true です。そうでなければ、結果は false です。この演算子は短絡評価されます。最初のオペランドが false の場合、2 番目のオペランドは評価されません。
組み込みの論理OR演算子の場合、最初のオペランドまたは2番目のオペランド(あるいはその両方)がtrueであれば、結果はtrueです。この演算子は短絡評価されます。最初のオペランドがtrueであれば、2番目のオペランドは評価されません。
ビットごとの論理演算子は短絡評価を行わないことに注意してください。
[編集] 結果
| a | true | false |
|---|---|---|
| !a | false | true |
| および | a | ||
|---|---|---|---|
| true | false | ||
| b | true | true | false |
| false | false | false | |
| or | a | ||
|---|---|---|---|
| true | false | ||
| b | true | true | true |
| false | 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; // 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::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 | |
| 2つのvalarray、またはvalarrayと値の各要素に二項演算子を適用する (関数テンプレート) | |
| エラーが発生したかを確認する (fail() のシノニム) ( std::basic_ios<CharT,Traits> の public メンバ関数) |
[編集] 関連項目
| x && y を実装する関数オブジェクト (クラステンプレート) | |
| x || y を実装する関数オブジェクト (クラステンプレート) | |
| !x を実装する関数オブジェクト (クラステンプレート) |
| 共通の演算子 | ||||||
|---|---|---|---|---|---|---|
| 代入 | インクリメント デクリメント |
算術 | 論理 | 比較 | メンバ アクセス |
その他 |
|
a = b |
++a |
+a |
!a |
a == b |
a[...] |
関数呼び出し a(...) |
| コンマ a, b | ||||||
| conditional a ? b : c | ||||||
| 特殊な演算子 | ||||||
|
static_castは、ある型を関連する別の型に変換する | ||||||
| 論理演算子に関するC ドキュメント
|