2017-08-05 162 views
2

比方说,我有一个简单的函数来检查一个条件,如果条件为真,则返回true,如果条件为false,则返回false。在布尔函数中使用elses C++

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

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

或者这种类型:

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

或者它只是真的不有所作为?另外,在决定是否“如果......其他”如果“与”如果...其他“与”开关“之间应该考虑什么?

+6

为什么不简单'返回条件表达式;'? –

+0

作为一个建模工具的角度来看,如果你反向工程..第二个会给你两个路径 –

+0

@Someprogrammerdude因为这会有很大的意义。 :P –

回答

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数不是素数。如果它不能被分开,那么循环将不受任何干扰地结束,并且将数字表示为素数。因此该功能正常工作。

+0

请具体 –

+0

我的意思是最好把条件返回你正在寻找的价值。例如,你知道你的情况在某些情况下是“真”的,而在其他情况下是“假”的。然后在这个函数中,只需要满足这个条件,就可以轻松写出大量的代码。和干净的代码。 – Shafi

0

由于两个给定的答案都没有击中指甲,我会给你另一个答案。

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

7

你也可以这样写,没有任何条件可言:

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

这样,你完全避免条件。

当然,如果您在处理需要条件的不同功能时,它应该没有区别。现代编译器可以很好地工作。

就使用开关vs if-else而言,当你有很多情况下,switch允许你跳转到单一的情况下,switch增加了效率,通过不运行所有的情况来加快执行速度。在较低的硬件/编译器级别,switch语句允许您进行单一检查/跳转,如果您有许多if语句,则需要进行多次检查/跳转。

0

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

但是,我同意其他人的看法,这种函数(两种变体)无论如何都没有意义,因为您可以简单地使用纯布尔条件代替这个函数,这只是一个不必要的包装。

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; 
} 

根据最合乎逻辑的意义选择表单,忽略这可能编译的方式。然后考虑按摩表单以减少视觉复杂性(避免过多的缩进或深度分支)。