readability-simplify-boolean-expr¶
Looks for boolean expressions involving boolean constants and simplifies them to use the appropriate boolean expression directly. Simplifies boolean expressions by application of DeMorgan’s Theorem.
Examples:
Initial expression |
Result |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- The resulting expression
e
is modified as follows: Unnecessary parentheses around the expression are removed.
Negated applications of
!
are eliminated.Negated applications of comparison operators are changed to use the opposite condition.
Implicit conversions of pointers, including pointers to members, to
bool
are replaced with explicit comparisons tonullptr
in C++11 orNULL
in C++98/03.Implicit casts to
bool
are replaced with explicit casts tobool
.Object expressions with
explicit operator bool
conversion operators are replaced with explicit casts tobool
.Implicit conversions of integral types to
bool
are replaced with explicit comparisons to0
.
- Examples:
The ternary assignment
bool b = (i < 0) ? true : false;
has redundant parentheses and becomesbool b = i < 0;
.The conditional return
if (!b) return false; return true;
has an implied double negation and becomesreturn b;
.The conditional return
if (i < 0) return false; return true;
becomesreturn i >= 0;
.The conditional return
if (i != 0) return false; return true;
becomesreturn i == 0;
.The conditional return
if (p) return true; return false;
has an implicit conversion of a pointer tobool
and becomesreturn p != nullptr;
.The ternary assignment
bool b = (i & 1) ? true : false;
has an implicit conversion ofi & 1
tobool
and becomesbool b = (i & 1) != 0;
.The conditional return
if (i & 1) return true; else return false;
has an implicit conversion of an integer quantityi & 1
tobool
and becomesreturn (i & 1) != 0;
Given
struct X { explicit operator bool(); };
, and an instancex
ofstruct X
, the conditional returnif (x) return true; return false;
becomesreturn static_cast<bool>(x);
Options¶
- IgnoreMacros¶
If true, ignore boolean expressions originating from expanded macros. Default is false.
- ChainedConditionalReturn¶
If true, conditional boolean return statements at the end of an
if/else if
chain will be transformed. Default is false.
- ChainedConditionalAssignment¶
If true, conditional boolean assignments at the end of an
if/else if
chain will be transformed. Default is false.
- SimplifyDeMorgan¶
If true, DeMorgan’s Theorem will be applied to simplify negated conjunctions and disjunctions. Default is true.
- SimplifyDeMorganRelaxed¶
If true,
SimplifyDeMorgan
will also transform negated conjunctions and disjunctions where there is no negation on either operand. This option has no effect ifSimplifyDeMorgan
is false. Default is false.When Enabled:
bool X = !(A && B) bool Y = !(A || B)
Would be transformed to:
bool X = !A || !B bool Y = !A && !B