至"if,if,if"或"if,else if else else if else"

qon*_*onf 19 c c++ if-statement

我正在编写一些数据分析代码,并且必须根据某些标准排除样本.在实践中,我最终编写如下代码:

bool Test(SampleType sample)
{
  if( ! SubTest1(sample) )
    return false;
  if( ! SubTest2(sample) )
    return false;
  if( ! SubTest3(sample) )
    return false;

  return true;
}
Run Code Online (Sandbox Code Playgroud)

以下似乎与我相同:

bool Test(SampleType sample)
{
  if( ! SubTest1(sample) )
    return false;
  else if( ! SubTest2(sample) )
    return false;
  else if( ! SubTest3(sample) )
    return false;
  else 
    return true;
}
Run Code Online (Sandbox Code Playgroud)

计算成本方面有区别吗?在可扩展性/可维护性,美学等方面是否存在可论证的优先考虑?

我知道这可能是一个无关紧要的问题,但是一旦我把这些问题困在脑子里,我就需要找到答案.

PS:如果有人关心,我的实际代码截至15/09可以在以下网址找到:http: //folk.uio.no/henrikq/conf.tgz

iam*_*ind 32

编译器为这两个版本生成相同的代码.但是,如果仅与第二个版本进行比较,则第一个版本在可维护性方面更好.

return遇到语句时代码退出; 所以else在即将到来的时候没有用if.它使开发人员更好地理解代码.

此外,如果这是文字代码,那么你仍然可以缩小为,

bool Test(SampleType sample)
{
  return (SubTest1(sample) && SubTest2(sample) && SubTest3(sample));
}
Run Code Online (Sandbox Code Playgroud)

  • 难道你不能争辩说第二个更可维护,因为如果它不再是早期的回归,你不会忘记把别的东西放进去吗? (6认同)
  • 这不是文字代码,但谢谢. (2认同)
  • @R.Martinho,可能有很多这样的可能性.我已经回答了确切的OP代码.如果`return`不在那里,那么代码的整个逻辑将会改变.实际上,我个人避免在函数中保留多个`return`值(因为它倾向于在每个`return`值处为自动对象放置析构函数代码).但是,OP的要求是不同的 (2认同)

Arn*_*anc 29

我会这样做:

return SubTest1(sample) && SubTest2(sample) && SubTest3(sample);
Run Code Online (Sandbox Code Playgroud)

这不会提高性能,但功能可能会(或可能不会)更明显.

  • 这很酷,但在调试器中很难跨越. (15认同)
  • @selalerer:不,可读性"优化". (10认同)
  • 哇,这就是我所说的优化:) (2认同)

sha*_*oth 13

两者在行为方面完全相同,编译器可能会为两者发出相同的机器代码.

它们在可读性方面甚至没有那么大差别 - 两者都具有相同的嵌套量.将此与没有早期返回导致深度嵌套的情况进行比较.

  • 只有当你从每个if()返回它们时它们是等效的 (2认同)

Jam*_*nze 5

在可读性方面,

bool Test( SampleType sample )
{
    return SubTest1( sample )
        && SubTest2( sample )
        && SubTest3( sample );
}
Run Code Online (Sandbox Code Playgroud)

比任何一个选项都清楚得多.否则,你肯定希望else明确表示,一旦满足其中一个条件,其他任何条件都不会被测试.

  • 查看我的实际案例的问题.这不是我最初展示我的acctuall代码的意图,我只是想弄清楚OP中的语句是否存在任何实际差异.我认为我的解决方案非常接近您的建议. (2认同)