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

Для встроенного оператора логического НЕ результат равен true , если операнд имеет значение false . В противном случае результат равен false .

Для встроенного логического оператора AND результат равен true , если оба операнда имеют значение true . В противном случае результат равен false . Этот оператор использует сокращённое вычисление : если первый операнд равен false , второй операнд не вычисляется.

Для встроенного оператора логического ИЛИ результат равен true если первый или второй операнд (или оба) имеют значение true . Этот оператор является сокращённым: если первый операнд равен true , второй операнд не вычисляется.

Обратите внимание, что побитовые логические операторы не выполняют сокращённое вычисление.

Результаты

a true false
! a false true
**Примечание:** Весь текст в таблице находится внутри тегов ` `, которые обозначают код на C++. Согласно инструкциям, код на C++ (включая ключевые слова `true`, `false` и оператор `!`) не переводится. Поэтому перевод не требуется - исходное содержимое полностью сохранено.
и a
true false
b true true false
false false false
**Изменения:** - Слово "and" переведено как "и" (логическое И в контексте C++) - Переменные "a" и "b" оставлены без перемена как идентификаторы в C++ - Ключевые слова "true" и "false" оставлены без перевода как зарезервированные слова C++ - HTML структура и атрибуты полностью сохранены
или a
true false
b true true true
false true false

В разрешении перегрузки для пользовательских операторов , следующие встроенные сигнатуры функций участвуют в разрешении перегрузки:

bool operator ! ( bool )
bool operator && ( bool , bool )
bool operator || ( bool , bool )
**Примечание:** Весь представленный код находится внутри тегов ` `, которые содержат исключительно C++ код и операторы. Согласно вашим инструкциям, содержимое внутри таких тегов (включая ключевые слова C++, операторы и синтаксис) не подлежит переводу, чтобы сохранить техническую точность и корректность кода.

Пример

#include <iostream>
#include <sstream>
#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::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
(шаблон класса)
Общие операторы
assignment increment
decrement
arithmetic logical comparison member
access
other

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-style приведение преобразует один тип в другой с помощью комбинации static_cast , const_cast и reinterpret_cast
new создает объекты с динамической продолжительностью хранения
delete уничтожает объекты, ранее созданные выражением new, и освобождает полученную область памяти
sizeof запрашивает размер типа
sizeof... запрашивает размер пакета (since C++11)
typeid запрашивает информацию о типе
noexcept проверяет, может ли выражение генерировать исключение (since C++11)
alignof запрашивает требования выравнивания типа (since C++11)

C documentation для Logical operators