假设我有一个检查条件的简单函数,如果条件为真则返回true,如果条件为假则返回false。
使用这种类型的代码是否更好:
bool myfunction( /*parameters*/ ) {
if ( /*conditional statement*/ ) {
return true;
}
return false;
}
或者这种类型:
bool myfunction( /*parameters*/ ) {
if ( /*conditional statement*/ ) {
return true;
}
else return false;
}
或者它真的没有什么区别?此外,在决定是否“如果......否则”与“如果......其他”与“切换”时,我应该考虑哪些因素?
答案 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;
}
根据最具逻辑意义的内容选择表单,只需忽略它的编译方式。然后考虑按摩表单以获得最小的视觉复杂性(避免过多的缩进或深度分支)。