On this page
Logical operators
Returns the result of a boolean operation.
| Operator name | Syntax | Overloadable | Prototype examples (for class T) |
|
|---|---|---|---|---|
| Inside class definition | Outside class definition | |||
| negation | not a
|
Yes | bool T::operator!() const; |
bool operator!(const T &a); |
| AND | a and b
|
Yes | bool T::operator&&(const T2 &b) const; |
bool operator&&(const T &a, const T2 &b); |
| inclusive OR | a or b
|
Yes | bool T::operator||(const T2 &b) const; |
bool operator||(const T &a, const T2 &b); |
Notes
|
||||
Explanation
The logic operator expressions have the form
! rhs |
(1) | |
lhs && rhs |
(2) | |
lhs || rhs |
(3) |
If the operand is not bool, it is converted to bool using contextual conversion to bool: it is only well-formed if the declaration bool t(arg) is well-formed, for some invented temporary t.
The result is a bool prvalue.
For the built-in logical NOT operator, the result is true if the operand is false. Otherwise, the result is false.
For the built-in logical AND operator, the result is true if both operands are true. Otherwise, the result is false. This operator is short-circuiting: if the first operand is false, the second operand is not evaluated.
For the built-in logical OR operator, the result is true if either the first or the second operand (or both) is true. This operator is short-circuiting: if the first operand is true, the second operand is not evaluated.
Note that bitwise logic operators do not perform short-circuiting.
Results
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 |
|
In overload resolution against user-defined operators, the following built-in function signatures participate in overload resolution:
|
||
|
||
|
Example
#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';
}
Output:
true
Enter 'quit' to quit.
> 3...
> 2...
> 1...
>
Standard library
Because the short-circuiting properties of operator&& and operator|| do not apply to overloads, and because types with boolean semantics are uncommon, only two standard library classes overload these operators:
| applies a unary arithmetic operator to each element of the valarray (public member function of std::valarray<T>) |
|
| applies binary operators to each element of two valarrays, or a valarray and a value (function template) |
|
checks if an error has occurred (synonym of fail()) (public member function of std::basic_ios<CharT,Traits>) |
See also
| Common operators | ||||||
|---|---|---|---|---|---|---|
| assignment | increment decrement |
arithmetic | logical | comparison | member access |
other |
|
|
|
|
|
|
function call |
a(...) |
||||||
| comma | ||||||
a, b |
||||||
| conditional | ||||||
a ? b : c |
||||||
| Special operators | ||||||
|
||||||
| C documentation for Logical operators |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/language/operator_logical