if-else与if-if-if

时间:2019-02-07 19:49:30

标签: if-statement standards

根据工作线索,

if (invalid) {
   ...some code
}

if (!invalid) {
  ...some code
}

if (invalid) {
  ...some code
} else {
  ...some code
}

可以解释为一种样式选择。我想知道人们在哪里划定界线,您会怎么看?

PS:是的,我知道否定不应该是if语句的“名义”情况。请忽略这一点,因为我试图准确复制引起讨论的问题代码。

2 个答案:

答案 0 :(得分:4)

这里不仅有冗余,而且根据语言的不同,正确性/有效性也会有所不同。考虑以下C#代码:

int value;
bool condition = DateTime.UtcNow.Second < 30;
if (condition)
{
    value = 10;
}
else            
{
    value = 20;
}
// No problem, value is definitely assigned
Console.WriteLine(value);

那是完全有效的。但是,如果我们以冗余样式编写它,则会得到一个编译时错误:

int value;
bool condition = DateTime.UtcNow.Second < 30;
if (condition)
{
    value = 10;
}
if (!condition)
{
    value = 20;
}
// error CS0165: Use of unassigned local variable 'value'
Console.WriteLine(value);

在Java中也是如此,我怀疑在许多其他语言中也是如此。编译器可以考虑以下事实:在if / else中,执行将恰好流入这些分支之一。在“两个if语句”样式中,语言规则不能保证这一点。

答案 1 :(得分:1)

这绝对不是样式选择。

如果您有两个单独的if,则该表达式将被有效评估两次。表达式可能很复杂,甚至可能是一个方法,该方法可能会产生副作用:

if (someMethod()) {
}

if (!someMethod()) {
}

区别应该很明显。

还要注意,if-else与编译器有所不同,因为编译器可以确保可以正确执行两个路径之一。这对于检测无法访问的代码,未初始化的变量和类似情况具有影响。

通常,编译器无法通过两个单独的if来检测相同的情况。