名稱空間
變體
操作

邏輯運算子

來自 cppreference.com
< cpp‎ | 語言
 
 
C++ 語言
表示式
替代表示
字面量
布林 - 整型 - 浮點型
字元型 - 字串型 - nullptr (C++11)
使用者定義 (C++11)
工具
屬性 (C++11)
型別
typedef 宣告
類型別名宣告 (C++11)
型別轉換
記憶體分配
類特有的函式屬性
explicit (C++11)
static

特殊成員函式
模板
雜項
 
 

返回布林運算的結果。

運算子名稱 語法 可過載 原型示例(對於 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);
注意
  • 關鍵字形式(andornot)和符號形式(&&||!)可以互換使用(參見備用表示)。
  • 所有內建運算子都返回 bool,並且大多數使用者定義過載也返回 bool,以便使用者定義的運算子可以像內建運算子一樣使用。但是,在使用者定義的運算子過載中,任何型別都可以用作返回型別(包括 void)。
  • 內建運算子 &&|| 執行短路求值(如果第一個運算元求值後結果已知,則不求值第二個運算元),但過載運算子的行為類似於常規函式呼叫,並且總是求值兩個運算元。

目錄

[編輯] 解釋

邏輯運算子表示式具有以下形式

! rhs (1)
lhs && rhs (2)
lhs || rhs (3)
1) 邏輯非
2) 邏輯與
3) 邏輯或(包含性)

如果運算元不是 bool,它會使用上下文轉換為 bool 轉換為 bool:如果宣告 bool t(arg) 對於某個虛構的臨時變數 t 是格式良好的,則轉換是格式良好的。

結果是一個 bool prvalue。

對於內建的邏輯非運算子,如果運算元為 false,則結果為 true。否則,結果為 false

對於內建的邏輯與運算子,如果兩個運算元都為 true,則結果為 true。否則,結果為 false。此運算子是短路的:如果第一個運算元為 false,則不求值第二個運算元。

對於內建的邏輯或運算子,如果第一個或第二個運算元(或兩者)為 true,則結果為 true。此運算子是短路的:如果第一個運算元為 true,則不求值第二個運算元。

請注意,按位邏輯運算子不執行短路求值。

[編輯] 結果

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 <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|| 的短路特性不適用於過載,並且因為具有布林語義的型別不常見,所以只有兩個標準庫類過載了這些運算子

對 valarray 的每個元素應用一元算術運算子
std::valarray<T> 的公共成員函式)
對兩個 valarray 的每個元素,或一個 valarray 和一個值應用二元運算子
(函式模板)
檢查是否發生錯誤(fail() 的同義詞)
std::basic_ios<CharT,Traits> 的公共成員函式) [編輯]

[編輯] 另請參閱

運算子優先順序

運算子過載

實現 x && y 的函式物件
(類模板) [編輯]
實現 x || y 的函式物件
(類模板) [編輯]
實現 !x 的函式物件
(類模板) [編輯]
常見運算子
賦值 遞增
遞減
算術 邏輯 比較 成員
訪問
其他

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_castconst_castreinterpret_cast 的組合將一種型別轉換為另一種型別
new 建立具有動態儲存期的物件
delete 銷燬先前由 new 表示式建立的物件並釋放獲得的記憶體區域
sizeof 查詢型別的大小
sizeof... 查詢 的大小 (C++11 起)
typeid 查詢型別的型別資訊
noexcept 檢查表示式是否可以丟擲異常 (C++11 起)
alignof 查詢型別的對齊要求 (C++11 起)

C 文件 關於 邏輯運算子