命名空间
变体
操作

逻辑运算符

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

返回布尔运算的结果。

运算符名称 语法 可重载 原型示例(对于 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 右值。

对于内置的逻辑非运算符,如果操作数为 false,则结果为 true。否则,结果为 false

对于内置的逻辑与运算符,如果两个操作数都是 true,则结果为 true。否则,结果为 false。此运算符是 短路求值:如果第一个操作数为 false,则不会对第二个操作数进行求值。

对于内置的逻辑或运算符,如果第一个或第二个操作数(或两者)为 true,则结果为 true。此运算符是短路求值:如果第一个操作数为 true,则不会对第二个操作数进行求值。

请注意,按位逻辑运算符 不执行短路求值。

[edit] 结果

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)

[edit] 示例

#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...
>

[edit] 标准库

由于 operator&&operator|| 的短路求值特性不适用于重载,并且由于具有布尔语义的类型并不常见,因此只有两个标准库类重载了这些运算符

std::valarray<T> 的每个元素应用一元算术运算符
(std::valarray<T> 的公有成员函数)
对两个 valarray 的每个元素,或 valarray 和一个值应用二元运算符
(函数模板)
检查是否发生了错误(fail() 的同义词)
(std::basic_ios<CharT,Traits> 的公有成员函数) [edit]

[edit] 另请参阅

运算符优先级

运算符重载

实现 x && y 的函数对象
(类模板) [edit]
实现 x || y 的函数对象
(类模板) [edit]
实现 !x 的函数对象
(类模板) [edit]
常用运算符
赋值 递增
递减
算术 逻辑 比较 成员
访问
其他

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 文档 针对 逻辑运算符