if 语句 - 短路评估与可读性

新手上路,请多包涵

有时, if 语句可能相当复杂或冗长,因此为了便于阅读,最好在 if 之前提取复杂的调用。

例如这个:

 if (SomeComplicatedFunctionCall() || OtherComplicatedFunctionCall())
{
    // do stuff
}

进入这个

bool b1 = SomeComplicatedFunctionCall();
bool b2 = OtherComplicatedFunctionCall();

if (b1 || b2)
{
    //do stuff
}

(提供的例子不是 那么 糟糕,它只是为了说明……想象其他带有多个参数的调用等)

但是通过这次提取,我失去了短路评估(SCE)。

  1. 我真的每次都失去 SCE 吗?是否存在允许编译器“优化它”并仍然提供 SCE 的情况?
  2. 有没有办法在不丢失 SCE 的情况下保持第二个片段的改进可读性?

原文由 relaxxx 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 513
1 个回答

一种自然的解决方案如下所示:

 bool b1 = SomeCondition();
bool b2 = b1 || SomeOtherCondition();
bool b3 = b2 || SomeThirdCondition();
// any other condition
bool bn = bn_1 || SomeFinalCondition();

if (bn)
{
  // do stuff
}

这具有易于理解、适用于所有情况以及具有短路行为的优点。


这是我最初的解决方案: 方法调用和 for 循环体中的一个很好的模式如下:

 if (!SomeComplicatedFunctionCall())
   return; // or continue

if (!SomeOtherComplicatedFunctionCall())
   return; // or continue

// do stuff

一个人可以获得与短路评估相同的良好性能优势,但代码看起来更具可读性。

原文由 Horia Coman 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题