Логические операторы
Возвращает результат логической операции.
| Имя оператора | Синтаксис | Перегружаемый | Примеры прототипов (для class T) |
|
|---|---|---|---|---|
| Внутри определения класса | Вне определения класса | |||
| отрицание |
not a
| Да |
bool T::operator!() const; |
bool operator!(const T &a); |
| И |
a and b
| Да |
bool T::operator&&(const T2 &b) const; |
bool operator&&(const T &a, const T2 &b); |
| включающее ИЛИ |
a or b
| Да |
bool T::operator||(const T2 &b) const; |
bool operator||(const T &a, const T2 &b); |
Примечания
|
||||
Пояснение
Логические выражения имеют следующий вид:
! rhs | (1) | |
lhs && rhs | (2) | |
lhs || rhs | (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|| не распространяются на перегруженные операторы, а типы с логической семантикой встречаются редко, эти операторы перегружаются только двумя классами стандартной библиотеки:
| применяет унарный арифметический оператор к каждому элементу 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 |
||||||
| Специальные операторы | ||||||
|
|
||||||
| Документация по C для логических операторов |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/language/operator_logical