有时,由于您的if和else if中条件背后的逻辑,您可以忽略最后的条件检查,而将其写为else。这样你就少做一次检查,不过阅读起来就不那么清晰了。什么是好的编码?因为检查少了一次,或者编译器针对这些情况进行了优化,所以它的效率会更高吗?

if(x<0){
//statements
}else if(x==0){
//statements
}else if(x>0){
//statements
}

或与其他

if(x<0){
//statements
}else if(x==0){
//statements
}else{
//statements
}

我想你是说else if (x == 0)。

else {明确表示没有留下任何案件。我通常会评论// x > 0,指出此时x的预期值,以防其他条件发生变化。

else { // x > 0

@Rgettman初学者错误。谢谢您。

在您的特定示例中,它们在编译器上是完全相同的,仍然要进行3次检查。第二个例子,从视觉的角度来看,看起来更清晰和完整。else通常用于防止可能的错误或不完整的逻辑/输出。

编译器如何在第二个示例中执行3次检查?

在爪哇中,如果在最后一个else if中包含条件,则存在一个潜在问题:

String whatIsX;
if (x < 0) {
// statements
whatIsX ="x is negative";
} else if (x == 0) {
// statements
whatIsX ="x is zero";
} else if (x > 0) {
// statements
whatIsX ="x is positive";
}
System.out.println(whatIsX);

这会给你一个错误。原因是编译器认为,如果if条件都不正确,则可能没有初始化whatIsX。我们知道这是不可能的,因为其中一个if条件必须是真的(假设x不能在错误的时间被另一个线程改变!)但是语言规则并不要求编译器尝试进行某种分析来解决这个问题。

因此,最好不要包括最后一个条件。将最后一个else if (x > 0)改为简单的else将使程序合法化。

这是Java的一个特性,因为它具有"明确的赋值"规则。该代码在大多数其他语言中都可以正常工作。

那么,你会说,由于这个明确的赋值规则,最好总是用else语句来处理最后一个条件,尽管选项背后有逻辑。我的意思是,代码的一致性很重要,因此使用else是有意义的,即使您没有为尚未实例化的变量赋值。

@是的,Joop一致性很重要。就我个人而言,我的习惯是在这种情况下,用一个没有if的else来结束;额外的代码对我来说似乎是多余的,如果您的编译器没有很好地优化,可能需要几纳秒的时间。:)这就是我用任何语言做事情的方式,甚至那些没有明确的分配规则的语言。从其他答案来看,这似乎是惯例。

在您的情况下,您已经定义了,可以不考虑它,因为只有3种可能性。那就是

x==0 or x<0 or x>0

考虑到一个场景,当最后一个漏洞被打开时,它会为一个漏洞大喊大叫,因为如果所有的if&else if都失败了,它将进入最后一个else,因为它没有界限。

最后一种方法是正确的,因为如果它不是= 0和< 0,那么它必须是> 0,并且没有遗漏其他可能性。

另一方面,您也可以考虑使用switch语句

int x = 3;
switch(x) {
case 1:  x < 0;
//something;
break;
case 2:  x == 0;
//something;
break;
case 3:  x > 0;
//something;
break;
default: break;
}

在您的案例中,将最后一个if进行比较是不理想的,就像前2个if语句不正确一样,那么第三个if语句必须是正确的。所以只保留其他的就可以了。

不过,三元运算符是我个人的选择。

(x>0) ? //statements : (x==0) ? //statements : //statements

基本上是读

if( x>0) then statements

else if(x==0) then statements

else statements

关于三元运算符或if语句的更多信息

三元运算符用于表达式,而不是语句。

比那还要糟。有些语言甚至不允许空块。在bash中,在某些情况下,可以对空语句使用冒号(":")。在python中,你可以说"通过"。

这里,我们甚至不考虑一个一语句块的强制包围问题。

我认为代码的清晰性非常重要,编译器在优化条件方面非常聪明。

如果有人能证明一个额外的测试总是失败的,并且它是在每秒执行十亿次的代码中,那么…也许那时。

否则,如果一定要漏掉其他的,你可能会对可能会添加其他"elseifs"的效果发表评论。