我想执行4'if'语句,如果它可以这样说;我想在事情发生之前检查四个值。我已经把:
if (a==1 && b==2 && c==3 && d==4) {
foo;
}
将这样的逻辑AND堆叠为首选方法还是四个单独的IF语句,一个在另一个首选内?逻辑ANDs方法对我来说似乎更有效但是它们不应该像这样堆叠的原因/时间/地点?或者它总是首选的方法?
答案 0 :(得分:5)
语义
if (a == 1 && b == 2 && c == 3 && d == 4) {
foo;
}
完全等同于
if (a == 1)
if (b == 2)
if (c == 3)
if (d == 4)
foo;
您选择看起来最具可读性的那个。 (请注意,如果您有许多链式条件,如果选择后一种选项,缩进级别将会非常糟糕。)
分开它的唯一原因是你需要单独的else子句:
if (a == 1) {
if (b == 2) {
....
} else {
// a == 1, but b != 2
}
} else {
// a != 1
}
答案 1 :(得分:3)
如果且仅当所有四个条件都为真时才需要采取行动,那么这正是写作的方式。
答案 2 :(得分:3)
更具可读性和可理解性。
以下代码
if(A)
if(B)
do something;
// no else
可能比if(A & B)
更容易理解,具体取决于问题。
答案 3 :(得分:3)
最可读的方式是首选方式。在这个特定的抽象示例中,if
肯定更具可读性。下面是一个示例,当首选使用多个if
s:
if (someObject != null) {
if (someObject.getType() == SomeClass.SomeType) {
// do something
}
// maybe more code working with someObject here, much later
}
不仅你可以看到这些检查明显是分开的(并且你没有弄乱检查的顺序),但是也可以在内部之后添加更多代码到someObject
做一些事情。马上。
至于效率,不仅你不应该考虑它,直到你遇到性能问题,并且分析表明这正是问题的根源,但在两种情况下它肯定都是相同的。编译器可能会将两种形式优化为相同的代码。
答案 4 :(得分:2)
也许你可以将这些条件包含在一个布尔值中,以便if
条件的紧凑性
boolean condition = (a==1 && b==2 && c==3 && d==4);
if(condition)
{
foo;
}
答案 5 :(得分:1)
conditional-and operator (&&)“仅在其左侧操作数的值为true
时才计算其右侧操作数。”如果提前知道true
或false
的概率,则更改谓词的顺序可能会有一些优势。
答案 6 :(得分:1)
在您的示例中,最佳解决方案就是您所做的。嵌套了很多if
s代码味道。不关心速度肯定是一样的,JIT会关注这种微不足道的优化。关心可读性。
在其他事情相同的情况下,较短的表达式是更好的可读性。
答案 7 :(得分:0)
这一切都取决于具体情况。将它们全部堆叠在一个条件中会为您提供所需的结果,但如果要在循环或任何其他执行非常多的代码块中进行测试,则可能效率低下。将这样的条件分割成子条件(多个if语句)是好的,如果这将要执行很多并且具有所需值的a,b,c和d的概率不相等。或者,如果某些条件比其他条件更昂贵(可能是某种函数调用。
例如,如果a不等于1的概率非常大,那么这样说是合理的:
if(a == 1)
if(...)
编译器不知道特定呼叫的概率或昂贵程度,因此您需要决定优化条件是否重要。 例如,如果您正在执行某种启发式搜索,这是达到目标的条件,那么对您的条件进行分区可以为您提供相当不错的性能提升。
如果您确定不会经常使用这部分代码,那么肯定会选择一个条件,因为代码可读性远比几纳秒重要。