有时, if
语句可能相当复杂或冗长,因此为了便于阅读,最好在 if
之前提取复杂的调用。
例如这个:
if (SomeComplicatedFunctionCall() || OtherComplicatedFunctionCall())
{
// do stuff
}
进入这个
bool b1 = SomeComplicatedFunctionCall();
bool b2 = OtherComplicatedFunctionCall();
if (b1 || b2)
{
//do stuff
}
(提供的例子不是 那么 糟糕,它只是为了说明……想象其他带有多个参数的调用等)
但是通过这次提取,我失去了短路评估(SCE)。
- 我真的每次都失去 SCE 吗?是否存在允许编译器“优化它”并仍然提供 SCE 的情况?
- 有没有办法在不丢失 SCE 的情况下保持第二个片段的改进可读性?
原文由 relaxxx 发布,翻译遵循 CC BY-SA 4.0 许可协议
一种自然的解决方案如下所示:
这具有易于理解、适用于所有情况以及具有短路行为的优点。
这是我最初的解决方案: 方法调用和 for 循环体中的一个很好的模式如下:
一个人可以获得与短路评估相同的良好性能优势,但代码看起来更具可读性。