Logical operators
返回布尔运算的结果。
| 运算符名称 | 语法 | 可重载 | 原型示例(针对 class T ) | |
|---|---|---|---|---|
| 类内定义 | 类外定义 | |||
| 逻辑非 |
not a
! a |
是 | bool T :: operator ! ( ) const ; | bool operator ! ( const T & a ) ; |
| 逻辑与 |
a and b
a && b |
是 | bool T :: operator && ( const T2 & b ) const ; | bool operator && ( const T & a, const T2 & b ) ; |
| 逻辑或 |
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 纯右值。
对于内置逻辑非运算符,若操作数为 false 则结果为 true 。否则结果为 false 。
对于内置逻辑与运算符,当两个操作数均为 true 时结果为 true 。否则结果为 false 。该运算符具有 短路求值 特性:若第一操作数为 false ,则不会对第二操作数进行求值。
对于内置逻辑 OR 运算符,当第一个操作数或第二个操作数(或两者)为 true 时,结果为 true 。该运算符具有短路特性:若第一个操作数为 true ,则不会对第二个操作数进行求值。
请注意, 位逻辑运算符 不执行短路求值。
结果
| a | true | false |
|---|---|---|
| ! a | false | true |
| and | a | ||
|---|---|---|---|
| true | false | ||
| b | true | true | false |
| false | false | false | |
标签内的C++术语(包括逻辑运算符"and"和布尔值"true"/"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; // 指针可转换为布尔值 if ( p && *p == 2 // 在 "p &&" 后使用 "*p" 是安全的 || !p && n != 2) // || 的优先级低于 && std::cout << "true\n"; // 流也可转换为布尔值 std::stringstream cin; cin << "3...\n" << "2...\n" << "1...\n" << "quit"; std::cout << "输入 'quit' 退出。\n"; for (std::string line; std::cout << "> " && std::getline(cin, line) && line != "quit";) std::cout << line << '\n'; }
输出:
true 输入 '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 文档
关于
逻辑运算符
|