首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >if语句-短路评估与可读性

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

Stack Overflow用户
提问于 2016-10-17 16:03:18
回答 10查看 14K关注 0票数 91

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

例如:

代码语言:javascript
复制
if (SomeComplicatedFunctionCall() || OtherComplicatedFunctionCall())
{
    // do stuff
}

进入到这个

代码语言:javascript
复制
bool b1 = SomeComplicatedFunctionCall();
bool b2 = OtherComplicatedFunctionCall();

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

(提供的例子并没有那么糟糕,它只是为了说明……假设其他调用有多个参数,等等。)

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

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

回答 10

Stack Overflow用户

回答已采纳

发布于 2016-10-17 16:09:25

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

代码语言:javascript
复制
bool b1 = SomeCondition();
bool b2 = b1 || SomeOtherCondition();
bool b3 = b2 || SomeThirdCondition();
// any other condition
bool bn = bn_1 || SomeFinalCondition();

if (bn)
{
  // do stuff
}

这样做的好处是易于理解,适用于所有情况,并具有短路行为。

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

代码语言:javascript
复制
if (!SomeComplicatedFunctionCall())
   return; // or continue

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

// do stuff

短路评估可以获得同样好的性能优势,但代码看起来更具可读性。

票数 119
EN

Stack Overflow用户

发布于 2016-10-17 19:28:02

我倾向于将条件分解为多行,例如:

代码语言:javascript
复制
if( SomeComplicatedFunctionCall()
 || OtherComplicatedFunctionCall()
  ) {

即使在处理多个运算符(&&)时,您也只需要使用每对括号进行缩进。SCE仍然有效--不需要使用变量。多年来,以这种方式编写代码使我更加易于阅读。更复杂的示例:

代码语言:javascript
复制
if( one()
 ||( two()> 1337
  &&( three()== 'foo'
   || four()
    )
   )
 || five()!= 3.1415
  ) {
票数 30
EN

Stack Overflow用户

发布于 2016-10-17 16:10:41

如果你有很长的条件链和保持一些短路的东西,那么你可以使用临时变量组合多个条件。以你的例子来说,可以这样做。

代码语言:javascript
复制
bool b = SomeComplicatedFunctionCall() || OtherComplicatedFunctionCall();
if (b && some_other_expression) { ... }

如果您有一个支持C++11的编译器,您可以使用lambda expressions将表达式组合成函数,如下所示:

代码语言:javascript
复制
auto e = []()
{
    return SomeComplicatedFunctionCall() || OtherComplicatedFunctionCall();
};

if (e() && some_other_expression) { ... }
票数 28
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40081279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档