命名空间
变体
操作

逻辑运算符

来自 cppreference.cn
< cpp‎ | 语言
 
 
C++ 语言
 
 

返回布尔运算的结果。

运算符名称 语法 可重载 原型示例(对于 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 文档 关于 逻辑运算符