If statement If else vs If not If If

If statement If else vs If not If If,if-statement,standards,If Statement,Standards,根据工作中的一位负责人的说法 if (invalid) { ...some code } if (!invalid) { ...some code } 及 可以解释为一种风格选择。我想知道人们在哪里划线,你会怎么想。< /P> PS:是的,我知道否定不应该是if语句的“名义”情况。请忽略这一点,因为我正试图复制引发讨论的相关代码。这里不仅存在冗余,而且根据语言的不同,正确性/有效性也可能存在差异。考虑这个C代码: int值; bool条件=DateTime.UtcNow.Secon

根据工作中的一位负责人的说法

if (invalid) {
   ...some code
}

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

可以解释为一种风格选择。我想知道人们在哪里划线,你会怎么想。< /P>
PS:是的,我知道否定不应该是if语句的“名义”情况。请忽略这一点,因为我正试图复制引发讨论的相关代码。

这里不仅存在冗余,而且根据语言的不同,正确性/有效性也可能存在差异。考虑这个C代码:

int值;
bool条件=DateTime.UtcNow.Second<30;
如果(条件)
{
数值=10;
}
其他的
{
数值=20;
}
//没问题,值是绝对指定的
控制台写入线(值);
这是完全正确的。但是如果我们以冗余样式编写它,我们将得到一个编译时错误:

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);
int值;
bool条件=DateTime.UtcNow.Second<30;
如果(条件)
{
数值=10;
}
如果(!条件)
{
数值=20;
}
//错误CS0165:使用未分配的局部变量“值”
控制台写入线(值);

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

这绝对不是样式选择

如果有两个独立的
If
s,则表达式将有效计算两次。表达式可能很复杂,甚至可能是一种方法,该方法可能有副作用:

if (someMethod()) {
}

if (!someMethod()) {
}
差别应该是显而易见的

还要注意的是,
if else
对编译器有影响,因为编译器可以确保两条路径中的一条路径可以被执行。这会导致检测无法访问的代码、未初始化的变量和类似情况


通常,编译器无法用两个独立的
if
s检测到相同的情况。

如果
无效的
可以在第一个块中修改,或者可以在另一个线程中修改,那么这两种方法肯定是不等价的。对我来说,第一个显然更糟糕,总是使用if-else。如果我没有错,在第二种情况下,你的算法只进行一次比较,它产生的处理时间更少。在任何情况下,我可能会选择
if{}else{}
,这样我就不必重复条件并将其反转。此外,条件可能是一个计算,比简单的布尔字段更复杂。除非这是C++或另一种允许重写否定的语言,否则它们应该是相同的。前者当然不太清楚,因为它允许快速阅读第三种情况,而后者显然只允许两种可能的情况。您的线索是错误的:p这不是相同的代码,因为无效代码确实可以修改。如果没有问题,但是不同的代码如果没有问题,则是双重测试,可读性较差,并阻止读取流
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);
if (someMethod()) {
}

if (!someMethod()) {
}