Java 如果主体是返回语句,为什么使用if、elseif而不是多if块
我总是习惯使用if,else-if语句而不是多个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
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!");
}