我有这样的代码,我觉得很难读:

// code1
if( (expensiveOperation1() && otherOperation() && foo())
     || (expensiveOperation2() && bar() && baz()) {
  // do something
}

我只是将其更改为以下内容,以使其更具可读性:
// code2
const bool expr1 = expensiveOperation1() && otherOperation() && foo();
const bool expr2 = expensiveOperation2() && bar() && baz();
if(expr1 || expr2){
   // one of the conditions met
}

但是我现在应该关注效率吗?

我的意思是,在code1中,如果满足了第一个连接子句,那么即使去看看第二个连接子句也不会费心,因为已经很清楚该语句是正确的。

但是在我更具可读性的示例中,必须同时计算cond1cond2。还是如果在其他地方未使用expr2,编译器是否足够聪明,可以将code2更改为code1

最佳答案

我应该说不应该,因为如果任何功能都有副作用,它们在逻辑上是不等效的。

但是,以下内容是等效的,并且它具有使您可以为测试函数指定描述性名称的优点,从而使代码更具自记录性:

// code3
inline bool combinedOp1()
{
    return expensiveOperation1() && otherOperation() && foo();
}

inline bool combinedOp2()
{
    return expensiveOperation2() && bar() && baz();
}

然后按如下方式调用它:
if (combinedOp1() || combinedOp2())
{
    // do something
}

08-16 11:06