逻辑运算符

来自cppreference.com
< cpp‎ | language
 
 
 
表达式
概述
值类别(左值 lvalue 、右值 rvalue 、亡值 xvalue )
求值顺序(序列点)
常量表达式
不求值表达式
初等表达式
lambda 表达式(C++11)
字面量
整数字面量
浮点字面量
布尔字面量
字符字面量,包含转义序列
字符串字面量
空指针字面量(C++11)
用户定义字面量(C++11)
运算符
赋值运算符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||b, a&&b, !a
比较运算符a==b, a!=b, a<b, a>b, a<=b, a>=b, a<=>b(C++20)
成员访问运算符a[b], *a, &a, a->b, a.b, a->*b, a.*b
其他运算符a(...), a,b, a?b:c
运算符的替代表示
优先级和结合性
折叠表达式(C++17)
new 表达式
delete 表达式
throw 表达式
alignof
sizeof
sizeof...(C++11)
typeid
noexcept(C++11)
运算符重载
类型转换
隐式转换
const_cast
static_cast
reinterpret_cast
dynamic_cast
显式转换 (T)a, T(a)
用户定义转换
 

返回布尔运算的结果。

运算符名 语法 可重载 原型示例(对于 class T
类定义中 类定义外
非(NOT) 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)。
  • 内建的运算符 &&|| 进行短路求值(当对第一个操作数求值后就可知其结果时不会对第二个进行求值),但重载运算符和普通函数调用的行为类似且总是对两个操作数进行求值。

目录

[编辑] 解释

逻辑运算符对布尔实参(或者可按语境转换为 bool 的类型}}运用逻辑函数(非(NOT),与(AND)和或(inclusive OR)),并给出布尔结果。与按位逻辑运算符不同,这些运算符(的内建形式)当对其第一个操作数求值后就可知其结果时不会对第二个进行求值。

[编辑] 内建的运算符

有如下内建函数签名参与重载解析:

bool operator!(bool)
bool operator&&(bool, bool)
bool operator||(bool, bool)

若操作数不是 bool,则通过按语境转换为 bool 来将之转换为 bool:仅当对某个虚构的临时变量 t 的声明 bool t(arg) 良构时,这才是良构的。

对于内建的逻辑 NOT 运算符,当操作数为 false 时其结果为 true。否则其结果为 false

对于内建的逻辑 AND 运算符,当两个操作数均为 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
or a
true false
b true true true
false true false

[编辑] 示例

#include <iostream>
#include <string>
int main()
{
    int n = 2;
    int* p = &n;
    // 指针可以转换为 bool
    if(    p && *p == 2   // "*p" 放在 "p &&" 之后是安全的
       || !p &&  n != 2 ) // || 的优先级低于 &&
        std::cout << "true\n";
 
    // streams 也可以转换为 bool
    std::cout << "Enter 'quit' to quit.\n";
    for(std::string line;    std::cout << "> "
                          && std::getline(std::cin, line)
                          && line != "quit"; )
        ;
}

输出:

true
Enter 'quit' to quit.
> test
> quit

[编辑] 标准库

由于 operator&&operator|| 的短路性质并不适用于重载,也由于具有布尔语义的类型较罕见,只有两个标准库的类重载了这些运算符:

对 valarray 的每个元素运用一元算术运算符
(std::valarray 的公开成员函数)
对两个 valarray 的每个元素或一个 valarray 和一个值运用二元运算符
(函数模板)
检查是否有错误发生(fail() 的同义词)
(std::basic_ios 的公开成员函数) [编辑]

[编辑] 另请参阅

运算符优先级

运算符重载

常见运算符
赋值 自增
自减
算术 逻辑 比较 成员访问 其他

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[b]
*a
&a
a->b
a.b
a->*b
a.*b

a(...)
a, b
? :

特殊运算符

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 起)