逻辑运算符
返回布尔运算的结果。
运算符名称 | 语法 | 可重载 | 原型示例(对于 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:如果声明 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 |
+a |
!a |
a == b |
a[...] |
函数调用 a(...) |
逗号 a, b | ||||||
条件运算符 a ? b : c | ||||||
特殊运算符 | ||||||
static_cast 将一种类型转换为另一种相关类型 |
C 文档 关于 逻辑运算符
|