命名空间
变体
操作

逻辑运算符

来自 cppreference.cn
< cpp‎ | language
 
 
C++ 语言
通用主题
流程控制
条件执行语句
if
迭代语句(循环)
for
range-for (C++11)
跳转语句
函数
函数声明
Lambda 函数表达式
inline 说明符
动态异常规范 (直到 C++17*)
noexcept 说明符 (C++11)
异常
命名空间
类型
说明符
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
存储持续时间说明符
初始化
 
 

返回布尔运算的结果。

运算符名称 语法 可重载 原型示例 (对于 class T)
在类定义内部 在类定义外部
取反 非 a

!a

bool T::operator!() const; bool operator!(const T &a);
a 与 b

a && b

bool T::operator&&(const T2 &b) const; bool operator&&(const T &a, const T2 &b);
包含或 a 或 b

a || b

bool T::operator||(const T2 &b) const; bool operator||(const T &a, const T2 &b);
注释
  • 关键字形式 (and, or, not) 和符号形式 (&&, ||, !) 可以互换使用(参见 替代表示)。
  • 所有内置运算符都返回 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 文档 关于 逻辑运算符