readability-simplify-boolean-expr

查找包含布尔常量的布尔表达式,并将它们简化为直接使用相应的布尔表达式。 通过应用 DeMorgan 定理来简化布尔表达式。

示例

初始表达式

结果

if (b == true)

if (b)

if (b == false)

if (!b)

if (b && true)

if (b)

if (b && false)

if (false)

if (b || true)

if (true)

if (b || false)

if (b)

e ? true : false

e

e ? false : true

!e

if (true) t(); else f();

t();

if (false) t(); else f();

f();

if (e) return true; else return false;

return e;

if (e) return false; else return true;

return !e;

if (e) b = true; else b = false;

b = e;

if (e) b = false; else b = true;

b = !e;

if (e) return true; return false;

return e;

if (e) return false; return true;

return !e;

!(!a || b)

a && !b

!(a || !b)

!a && b

!(!a || !b)

a && b

!(!a && b)

a || !b

!(a && !b)

!a || b

!(!a && !b)

a || b

生成的表达式 e 如下修改
  1. 表达式周围不必要的括号被删除。

  2. 消除 ! 的否定应用。

  3. 将比较运算符的否定应用更改为使用相反的条件。

  4. 在 C++11 中,指针(包括指向成员的指针)到 bool 的隐式转换被替换为与 nullptr 的显式比较;在 C++98/03 中,则替换为与 NULL 的显式比较。

  5. 将隐式转换为 bool 替换为显式转换为 bool

  6. 具有 explicit operator bool 转换运算符的对象表达式被替换为显式转换为 bool

  7. 将整数类型隐式转换为 bool 替换为与 0 的显式比较。

示例
  1. 三元赋值 bool b = (i < 0) ? true : false; 包含多余的括号,并变为 bool b = i < 0;

  2. 条件返回 if (!b) return false; return true; 包含隐含的双重否定,并变为 return b;

  3. 条件返回 if (i < 0) return false; return true; 变为 return i >= 0;

    条件返回 if (i != 0) return false; return true; 变为 return i == 0;

  4. 条件返回 if (p) return true; return false; 包含指针到 bool 的隐式转换,并变为 return p != nullptr;

    三元赋值 bool b = (i & 1) ? true : false; 包含 i & 1bool 的隐式转换,并变为 bool b = (i & 1) != 0;

  5. 条件返回 if (i & 1) return true; else return false; 包含整数数量 i & 1bool 的隐式转换,并变为 return (i & 1) != 0;

  6. 给定 struct X { explicit operator bool(); };struct X 的一个实例 x,条件返回 if (x) return true; return false; 变为 return static_cast<bool>(x);

选项

IgnoreMacros

如果为 true,则忽略源自展开宏的布尔表达式。 默认值为 false

ChainedConditionalReturn

如果为 true,则 if/else if 链末尾的条件布尔返回语句将被转换。 默认值为 false

ChainedConditionalAssignment

如果为 true,则 if/else if 链末尾的条件布尔赋值语句将被转换。 默认值为 false

SimplifyDeMorgan

如果为 true,则将应用 DeMorgan 定理来简化否定的合取和析取。 默认值为 true

SimplifyDeMorganRelaxed

如果为 true,则 SimplifyDeMorgan 还将转换否定的合取和析取,其中任一操作数都没有否定。 如果 SimplifyDeMorganfalse,则此选项无效。 默认值为 false

启用时

bool X = !(A && B)
bool Y = !(A || B)

将被转换为

bool X = !A || !B
bool Y = !A && !B