逻辑运算符

来自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++20)
运算符的替代表示
优先级和结合性
折叠表达式(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 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);
注意
  • 能交替使用关键词形式( andornot )和符号形式( &&||! )(见替用表示
  • 所有内建运算符都返回 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 ,则不求值第二运算数。

注意逐位逻辑运算符不进行短路。

[编辑] 结果

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)

[编辑] 示例

#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";
 
    // 流亦可转换为 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 起)

逻辑运算符C 文档