Spec-Zone.ru › C++

Логические операторы

Возвращает результат булевого оператора.

Имя оператора Синтаксис Перегружаемый Примеры прототипов (для 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).
  • Встроенные операторы && и || выполняют короткое замыкание (не вычисляют второй операнд, если результат известен после вычисления первого), но перегруженные операторы ведут себя как обычные вызовы функций и всегда вычисляют оба операнда.

Объяснение

Выражения логических операторов имеют вид

! правый операнд (1)
левый операнд && правый операнд (2)
левый операнд || правый операнд (3)
1) Логическое НЕ
2) Логическое И
3) Логическое включительно ИЛИ

Если операнд не bool, он преобразуется в bool с помощью контекстного преобразования в bool: он является корректным только в том случае, если объявление bool t(arg) корректно для некоторой вымышленной временной переменной t.

Результат — bool prvalue.

Для встроенного логического оператора НЕ результат — true если операнд — false. В противном случае результат — 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 <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...
>

Стандартная библиотека

Поскольку свойства короткого замыкания operator&& и operator|| не применяются к перегрузкам, а типы с булевыми семантиками встречаются редко, только два класса стандартной библиотеки перегружают эти операторы:

operator!
применяет унарный арифметический оператор к каждому элементу valarray
(публичный член-функция std::valarray<T>)
operator&&operator||
применяет бинарные операторы к каждому элементу двух valarray или valarray и значению
(шаблон функции)
operator!
проверяет наличие ошибки (синоним fail() )
(публичный член-функция std::basic_ios<CharT,Traits>)

См. также

Порядок приоритета операторов

Перегрузка операторов

Общие операторы
присваивание инкремент
декремент
арифметические логический сравнение доступ к членам
доступа
другие

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)

END_OF_DOCUMENT_MARKER ```
Документация C для Логических операторов

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/language/operator_logical

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API