Namespaces
Variants

Logical operators

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

返回布尔运算的结果。

运算符名称 语法 可重载 原型示例(针对 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 ) ;
注意
  • 关键字形式( 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 ,则不会对第二操作数进行求值。

对于内置逻辑 OR 运算符,当第一个操作数或第二个操作数(或两者)为 true 时,结果为 true 。该运算符具有短路特性:若第一个操作数为 true ,则不会对第二个操作数进行求值。

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

结果

a true false
! a false true
and a
true false
b true true false
false false false
(注:根据要求,所有HTML标签、属性及 标签内的C++术语(包括逻辑运算符"and"和布尔值"true"/"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;
    // 指针可转换为布尔值
    if (    p && *p == 2  // 在 "p &&" 后使用 "*p" 是安全的
        || !p &&  n != 2) // || 的优先级低于 &&
        std::cout << "true\n";
    // 流也可转换为布尔值
    std::stringstream cin;
    cin << "3...\n" << "2...\n" << "1...\n" << "quit";
    std::cout << "输入 'quit' 退出。\n";
    for (std::string line;    std::cout << "> "
                           && std::getline(cin, line)
                           && line != "quit";)
        std::cout << line << '\n';
}

输出:

true
输入 '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_cast const_cast reinterpret_cast 将一种类型转换为另一种类型
new 创建具有动态存储期的对象
delete 销毁先前由 new 表达式创建的对象并释放获取的内存区域
sizeof 查询类型的大小
sizeof... 查询 参数包 的大小 (C++11 起)
typeid 查询类型的类型信息
noexcept 检查表达式是否能抛出异常 (C++11 起)
alignof 查询类型的对齐要求 (C++11 起)

C 文档 关于 逻辑运算符