在布尔函数c ++中使用elses

时间:2017-08-05 06:06:29

标签: c++

假设我有一个检查条件的简单函数,如果条件为真则返回true,如果条件为假则返回false。

使用这种类型的代码是否更好:

bool myfunction( /*parameters*/ ) {
    if ( /*conditional statement*/ ) {
        return true;
    }
    return false;
}

或者这种类型:

bool myfunction( /*parameters*/ ) {
    if ( /*conditional statement*/ ) {
        return true;
    }
    else return false;
}

或者它真的没有什么区别?此外,在决定是否“如果......否则”与“如果......其他”与“切换”时,我应该考虑哪些因素?

5 个答案:

答案 0 :(得分:8)

你也可以在没有任何条件的情况下写这个:

bool myfunction( /*parameters*/ ) {
    return /*conditional statement*/;
 }

这样你完全避免了条件。

当然,如果你正在处理需要条件的不同函数,它应该没有区别。现代编译器无论如何都能很好地工作。

就使用switch vs if-else而言,当你有许多情况时,通过允许你跳转到单个情况,开关可以提高效率,通过不运行所有情况来提高执行速度。在较低(硬件/编译器级别),switch语句允许您进行单个检查/跳转,如果您有许多if语句,则需要进行许多检查/跳转。

答案 1 :(得分:1)

它是一样的。记住,只要你说

return boolean;

函数结束并返回其调用行。 因此把它放在其他地方或只是简单地把它放在一起。

说我们要查看素数

bool isPrime (int n){
     for (int i = 2; i <= sqrt(n); i++){
         if (n % i == 0)
             return false;
     }
     return true;
}

如果你仔细看到这个函数,你会知道数字是否正确地划分为sqrt(n)范围内的任何值,它将返回false,因为数字不是素数。 如果它不能被分割,那么循环将在没有任何干扰的情况下结束并且表示该数字是素数。因此功能正常。

答案 2 :(得分:1)

由于两个给定的答案都没有达到钉子,我会再给你一个。

从代码(或编译器)视图中,假设最近的编译器两个版本都相同。编译器会将if版本优化为return版本。差异在于调试 - 您正在使用的调试器可能不允许您在返回值上设置断点(例如,如果您希望仅在返回真值时设置断点)。虽然if版本在不同的行上给你两个return语句,但任何理智的调试器都可以在线设置断点。

答案 3 :(得分:0)

无论编译器应用何种优化,两个函数都是相同的,因为第二个函数中的“else”没有任何影响。如果在满足条件时立即离开该函数,则在这种情况下您永远不会进入另一个分支,因此“else”隐含在第一个版本中。 因此我更喜欢第一个版本,因为另一个版本中的“else”会产生误导。

但是,我同意其他人的观点,这种函数(两种变体)无论如何都没有意义,因为你可以简单地使用普通布尔条件而不是这个函数,这只是一个不必要的包装器。

答案 4 :(得分:0)

在编译方面,你选择的if-else语法的具体形式不会产生很大的影响。优化路径通常会消除任何差异。您的决定应该基于视觉形式。

正如其他人已经指出的那样,如果您有这样一个简单的条件,最好直接返回计算并避免使用if语句。

直接返回仅在您进行布尔计算时才有效。您可能需要返回其他类型:

int foo(/*args*/) {
  if(/*condition*/) {
     return bar();
  }
  return 0;
}

或者你可以使用三元运算符?:,但如果表达式可能不那么清楚。

通过使用短回报(评估不会到达函数的末尾),您还可以对多个条件和评估进行排序。

int foo(/*args*/) {
  if(/*condition1*/) {
     return 0;
  }

  if(/*condition2*/) {
     return 3;
  }

  int common = bar(/*args*/);
  if(/*condition3*/) {
     return 1-common;
  }

  return common;
}

根据最具逻辑意义的内容选择表单,只需忽略它的编译方式。然后考虑按摩表单以获得最小的视觉复杂性(避免过多的缩进或深度分支)。