Java 如果主体是返回语句,为什么使用if、elseif而不是多if块

Java 如果主体是返回语句,为什么使用if、elseif而不是多if块,java,c++,Java,C++,我总是习惯使用if,else-if语句而不是多个if语句 例如: int val = -1; if (a == b1) { return c1; } else if (a == b2) { return c2; } ... ... } else { return c11; } 它与示例2相比如何: if (a == b1) { return c1; } if (a == b2) { return c2; } .... if (a == b11) { ret

我总是习惯使用if,else-if语句而不是多个if语句

例如:

int val = -1;
if (a == b1) {
   return c1;
} else if (a == b2) {
   return c2;
} ...
...
} else {
   return c11;
}
它与示例2相比如何:

if (a == b1) {
   return c1;
}
if (a == b2) {
   return c2;
}
....

if (a == b11) {
   return c11;
}

我知道他们是一样的。但最好的做法是“如果”还是“如果”,还是“不”?这是我的一个朋友提出的,当时我指出他可以用不同的结构来构建代码库,使其更干净。这已经是我很长时间的习惯了,但我从未问过为什么

if elseif else
语句一旦发现一个是真的,就停止进行比较<代码>如果进行每次比较。第一种更有效

Edit:注释中指出,您在每个
if
块中执行
返回
。在这些情况下,或者在控制将离开方法的情况下(例外),执行多个
if
语句和执行
if elseif else
语句之间没有区别


但是,无论如何,最好使用
if-elseif-else
。假设您更改了代码,这样您就不会在每个
if
块中执行
返回。然后,为了保持效率,您还必须更改为
if-elseif-else
习惯用法。从一开始就将它设置为
if elseif
可以节省您将来的编辑,并且对于阅读您的代码的人来说更清晰(请看我刚才通过略读您的代码而给您的误解!)。

if
else if
与两个连续的
if
语句不同。在第一个分支中,当CPU执行第一个
if
分支时,不会检查
else if
。在两个连续的
if
语句中,即使第一个
if
被选中并执行,如果条件为真,下一个
if
也将被选中并执行。

我认为这些代码片段是等效的,原因很简单,您有许多
返回
语句。如果您有一个
return
语句,那么您将使用这里不需要的
else
构造。

您的比较依赖于If语句体从方法返回控件这一事实。否则,功能将有所不同


在这种情况下,它们执行相同的功能。在我看来,后者更容易阅读和理解,我可以选择使用后者。

它们可能会做不同的事情


如果
a
等于
b1
b2
,则输入两个
If
块。在第一个示例中,您只能输入一个。我认为第一个示例更快,因为编译器可能需要按顺序检查每个条件,因为某些比较规则可能会应用于对象。它可能能够优化它们。。。但是,如果您只想输入一个,那么第一种方法更为明显,不太可能导致开发人员出错或代码效率低下,因此我绝对推荐。

这两种方法在功能上并不相同

它在功能上等价的唯一方法是,如果您对a的每个可能值(即:C中limits.h中定义的每个可能的int值;使用int_MIN和int_MAX,或Java中的等效值)执行“if”语句

else语句允许您覆盖所有可能的剩余值,而无需编写数百万条“if”语句

另外,更好的编码实践是使用if…else if…else,就像在switch/case语句中一样,如果您不提供“default”case语句,编译器会用警告来提醒您。这可以防止您忽略程序中的无效值。例如:

double square_root(double x) {
    if(x > 0.0f) {
        return sqrt(x);
    } else if(x == 0.0f) {
        return x;
    } else {
        printf("INVALID VALUE: x must be greater than zero");
        return 0.0f;
    }
}
在这种情况下,是否要为x的每个可能值键入数百万条if语句?怀疑:)


干杯

如果
b1==b2
呢?(如果
a==b1
a==b2
?)

当这种情况发生时,一般来说,以下两段代码很可能具有不同的行为:

if (a == b1) {
   /* do stuff here, and break out of the test */
} 
else if (a == b2) {
   /* this block is never reached */
} 
以及:

如果要清楚地描述不同情况下的功能,请使用
If-else
switch-case
进行一次测试

如果您希望在多个情况下使用不同的功能,则使用多个
If
块作为单独的测试


与其说是“最佳实践”的问题,还不如说是定义一个测试还是多个测试。

我倾向于认为使用
else if
更容易,在面对代码更改时更稳健。如果有人要调整函数的控制流,并用副作用替换返回,或用
try catch
替换函数调用,则
如果
的所有条件都是真正独占的,则
将很难失败。这确实取决于你正在做的精确的代码来做出一般的判断,你需要考虑到简洁的可能的权衡。

< CpSPICE的答案是正确的。性能的另一个考虑因素是找出最常发生的条件。例如,如果a==b1只发生1%的时间,那么您可以通过先检查另一种情况来获得更好的性能

女孩喜欢玉米卷,答案也不错。最佳做法是确保涵盖所有案例

在每个
if
分支中使用
return
语句。 在代码中,在每个if条件中都有
return
语句。当你遇到这样的情况时,有两种方法来写这个。第一个是如何在示例1中编写的:

if (a == b1) {
   return c1;
} else if (a == b2) {
   return c2;
} else {
   return c11;
}
另一项是:

if (a == b1) {
   return c1;
}
if (a == b2) {
   return c2;
}
return c11; // no if or else around this return statement
这两种编写代码的方法是相同的

示例2中编写代码的方式不会编译在C++或java中(并且将在C中是未定义的行为),因为编译器不知道您已经覆盖了<>代码> A/EXECK >的所有可能值,因此它认为函数中有一条代码路径。

if (a == b1) {
   return c1;
}
if (a == b2) {
   return c2;
}
return c11; // no if or else around this return statement
if (a == b1) {
   return c1;
}
if (a == b2) {
   return c2;
}
...
if (a == b11) {
   return c11;
}
// what if you set a to some value c12?
if (strcmp(str, "b1") == 0) {
  ...
}
if (strcmp(str, "b2") == 0) {
  ...
}
if (strcmp(str, "b3") == 0) {
  ...
}
if(a && (c == d))
{
} elseif ( b && (!d || a))
{
} elseif ( d == a && ( b^2 > c))
{
} else {
}
if (x > 1) {
    System.out.println("Hello!");
}else if (x < 1) {
    System.out.println("Bye!");
}
if (x > 1) {
    System.out.println("Hello!");
}
if (x < 1) {
    System.out.println("Bye!");
}