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
! a |
Yes | bool T :: operator ! ( ) const ; | bool operator ! ( const T & a ) ; |
| AND |
a and b
a && b |
Yes | bool T :: operator && ( const T2 & b ) const ; | bool operator && ( const T & a, const T2 & b ) ; |
| inclusive OR |
a or b
a || b |
Yes | bool T :: operator || ( const T2 & b ) const ; | bool operator || ( const T & a, const T2 & b ) ; |
|
||||
Contents |
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:
|
bool
operator
!
(
bool
)
|
||
|
bool
operator
&&
(
bool
,
bool
)
|
||
|
bool
operator
||
(
bool
,
bool
)
|
||
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
|
function object implementing
x
&&
y
(class template) |
|
|
function object implementing
x
||
y
(class template) |
|
|
function object implementing
!
x
(class template) |
| Common operators | ||||||
|---|---|---|---|---|---|---|
| assignment |
increment
decrement |
arithmetic | logical | comparison |
member
access |
other |
|
a
=
b
|
++
a
|
+
a
|
!
a
|
a
==
b
|
a
[
...
]
|
function call
a ( ... ) |
|
comma
a, b |
||||||
|
conditional
a ? b : c |
||||||
| Special operators | ||||||
|
static_cast
converts one type to another related type
|
||||||
|
C documentation
for
Logical operators
|