为什么我们使用if,否则如果body是return语句而不是if if block

Lil*_*ily 35 c++ java

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

例:

int val = -1;
if (a == b1) {
   return c1;
} else if (a == b2) {
   return c2;
} ...
...
} else {
   return c11;
}
Run Code Online (Sandbox Code Playgroud)

它与例2相比如何:

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

if (a == b11) {
   return c11;
}
Run Code Online (Sandbox Code Playgroud)

我知道功能明智,他们是一样的.但是,如果不这样做,最好的做法是 - 如果,不是吗?当我指出他可以用不同的方式构建代码库以使其更清晰时,它由我的一个朋友提出.这对我来说已经习惯了很长时间,但我从未问过为什么.

Can*_*ice 60

if-elseif-else一旦发现一个是真的,语句就会停止进行比较.if-if-if做每一次比较.第一个是更有效率.

编辑:在评论中已经指出你return在每个if区块内做了一个.在这些情况下,或者在控制将离开方法(例外)的情况下,执行多个if语句和执行if-elseif-else语句之间没有区别.

但是,if-elseif-else无论如何都要使用它.假设您更改了代码,使得您不会return在每个if块中执行此操作.然后,为了保持高效,你还必须改为if-elseif-else成语.拥有它if-elseif-else从一开始就可以保存您以后的编辑,并且对于阅读您的代码的人来说更清楚(见证我刚刚通过浏览代码给您的误解!).

  • 帖子暗示每个条件都执行`return`,因此方法执行在一个条件成功后停止. (8认同)

Ale*_*lds 10

怎么样的情况b1 == b2呢?(如果a == b1a == b2?)

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

if (a == b1) {
   /* do stuff here, and break out of the test */
} 
else if (a == b2) {
   /* this block is never reached */
} 
Run Code Online (Sandbox Code Playgroud)

和:

if (a == b1) {
   /* do stuff here */
}
if (a == b2) {
   /* do this stuff, as well */
}
Run Code Online (Sandbox Code Playgroud)

如果要清楚地描述不同情况的功能,请使用if-elseswitch-case进行一次测试.

如果您希望针对多种情况使用不同的功能,请使用多个if块作为单独的测试.

这不是"最佳实践"的问题,而是定义您是否进行一次测试或多次测试.


Clo*_*oud 7

它们在功能上并不相同.

它在功能上等价的唯一方法是,如果你为a的每个可能值做了一个"if"语句(即:每个可能的int值,如C中limits.h中定义的那样;使用INT_MIN和INT_MAX,或Java中的等价物).

else语句允许您覆盖每个可能的剩余值,而无需编写数百万个"if"语句.

此外,使用if ... else if else的更好的编码实践,就像在switch/case语句中一样,如果你没有提供"默认"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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您是否要为x的每个可能值键入数百万个if语句?怀疑 :)

干杯!

  • 如果我们在每个if代码块中都有一个返回它们是等价的.无效值部分不在else块中,而是在最后一个if之后的普通代码.功能完全相同.即使没有return语句,我们也可以获得功能上等效的代码,除了我们对每个if进行一次额外的检查(尽管一个好的编译器也可以删除它) (5认同)