Logical operators
Возвращает результат булевой операции.
| Название оператора | Синтаксис | Перегружаемый | Примеры прототипов (для 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 ) ; |
|
||||
Содержание |
Объяснение
Логические операторные выражения имеют вид
!
rhs
|
(1) | ||||||||
lhs
&&
rhs
|
(2) | ||||||||
lhs
||
rhs
|
(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 |
| и | a | ||
|---|---|---|---|
| true | false | ||
| b | true | true | false |
| false | false | 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; // указатели преобразуются в 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
|
+
a
|
!
a
|
a
==
b
|
a
[
...
]
|
вызов функции
a ( ... ) |
|
запятая
a, b |
||||||
|
условный оператор
a ? b : c |
||||||
| Специальные операторы | ||||||
|
static_cast
преобразует один тип в другой связанный тип
|
||||||
|
C documentation
для
Logical operators
|