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 |
[edit]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.
[edit]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) | ||
[edit]Example
#include <iostream>#include <sstream>#include <string> int main(){int n =2;int* p =&n;// pointers are convertible to boolif( 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 boolstd::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... >
[edit]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> ) |
[edit]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 |