逻辑运算符
返回布尔运算的结果。
| 运算符名 | 语法 | 可重载 | 原型示例(对于类 class T ) | |
|---|---|---|---|---|
| 类内定义 | 类外定义 | |||
| 非 |  not a
 
  | 
是 | bool T::operator!() const; | bool operator!(const T &a); | 
| 与 |  a and b
 
  | 
是 | bool T::operator&&(const T2 &b) const; | bool operator&&(const T &a, const T2 &b); | 
| 同或 |  a or b
 
  | 
是 | bool T::operator||(const T2 &b) const; | bool operator||(const T &a, const T2 &b); | 
  | ||||
解释
逻辑运算符的形式为
 ! 操作数
 | 
(1) | ||||||||
 左操作数 && 右操作数
 | 
(2) | ||||||||
 左操作数 || 右操作数
 | 
(3) | ||||||||
若操作数并非 bool,则用按语境转换为 bool 规则将它转换为 bool:仅当对某个虚构的临时量 t,声明 bool t(arg) 良构时,它才是良构的。
其结果是 bool 纯右值。
对于内建的逻辑非运算符,若操作数为 false 则结果为 true。否则结果为 false。
对于内建的逻辑与运算符,若两个运算数都是 true 则结果为 true。否则结果为 false。此运算符短路求值:若第一操作数为 false,则不求值第二操作数。
对于内建的逻辑或运算符,若第一或第二操作数之一(或两者同)为 true,则结果为 true。此运算符短路求值:若第一操作数为 true,则不求值第二操作数。
注意逐位逻辑运算符不进行短路求值。
结果
| 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 | |
在面对用户定义运算符的重载决议中,下列内建函数签名参与重载决议:
|   bool operator!(bool)  | 
||
|   bool operator&&(bool, bool)  | 
||
|   bool operator||(bool, bool)  | 
||
示例
#include <iostream> #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::cout << "输入 'quit' 以退出。\n"; for(std::string line; std::cout << "> " && std::getline(std::cin, line) && line != "quit"; ) ; }
输出:
true 输入 'quit' 以退出。 > test > quit
标准库
因为 operator&& 和 operator|| 的短路求值性质对重载不适用,又因为有布尔语义的类型不常见,故只有二个标准库类重载了这些运算符:
|   对 valarray 的每个元素应用一元算术运算符  ( std::valarray<T> 的公开成员函数)
 | |
|   对两个 valarray 的每个元素,或一个 valarray 的每个元素和一个值应用二元运算符  (函数模板)  | |
|    检查是否有错误发生(fail() 的同义词)  ( std::basic_ios<CharT,Traits> 的公开成员函数)  | 
参阅
| 常见运算符 | ||||||
|---|---|---|---|---|---|---|
| 赋值 | 自增/自减 | 算术 | 逻辑 | 比较 | 成员访问 | 其他 | 
| 
 a = b  | 
 ++a  | 
 +a  | 
 !a  | 
 a == b  | 
 a[b]  | 
函数调用 | 
| a(...) | ||||||
| 逗号 | ||||||
| a, b | ||||||
| 条件 | ||||||
| a ? b : c | ||||||
| 特殊运算符 | ||||||
| 
 static_cast 转换一个类型为另一相关类型  | ||||||