在 if 语句内继续循环与在循环内使用 if 语句的否定

Posted

技术标签:

【中文标题】在 if 语句内继续循环与在循环内使用 if 语句的否定【英文标题】:Continue loop Inside if statement vs. using the negation of the if statment inside the loop 【发布时间】:2011-05-14 14:15:28 【问题描述】:

例如,让我们考虑以下 2 个代码:

for (i = 0; i < 1000; i++)

   if ( i % 2 != 0)
   
       continue;
   
   else
   
     ...  
       

for (i = 0; i < 1000; i++)

   if (i % 2 == 0)
   
     ...  
       

两者都会导致相同的结果。那么使用哪一个呢?哪一个更好?两者之间是否存在显着的性能差异?让我们看看你们对此有何看法。我喜欢我在这里看到的关于这些事情的讨论。这可能会导致更好的代码编写和更好的执行时间。我发布了这个问题,因为我没有找到答案。如果我没有找到答案,我将来可能会发布另一个这样的问题。

附:当你可以不使用 continue 时,在循环中使用 continue 的目的是什么?

【问题讨论】:

for(i = 0; i &lt; 1000; i+=2) 还是更好。 continue 的目的是当你的循环中有复杂的决策路径时。 好的答案和cmets。此外,这严格来说是一个微优化问题。恕我直言,真正的性能调整从 macro-optimization 开始。 【参考方案1】:

在这个具体的例子中?使用continue 没有任何意义。

正如您所提到的,两个代码示例产生完全相同的结果。而且两者都不会比另一个更快。

您应该根据可读性和清晰度来决定更喜欢哪一个,而不是某种误导性的“优化”尝试。考虑到这一点,第二个就更清楚了。我会认真质疑在真实代码库中使用第一个的人的编程能力。

作为基本准则,当单个 if 可以使用时,切勿使用 if-else。在这种情况下,您正在比较 !=,然后使用 else 语句找到与之相反的结果——这几乎就像说 !(!=) 一样,会产生双重否定。很难阅读或理解。一般来说,您应该尝试在if 语句中评估肯定条件,而不是否定条件,以防止这种情况发生。

而且确实没有理由发布与此类似的其他问题。所有的答案都是一样的。忽略任何可能的性能差异(如果甚至存在,考虑到优化编译器,这不太可能),并专注于哪个版本对您作为必须阅读它的人最有意义。请忽略任何给你相反建议的人。

【讨论】:

是的,著名的 if (!isNotX) 情况 - 遵循这样的逻辑总是很有趣。【参考方案2】:

我绝对不会考虑第一个选项,因为我认为它会在流程中添加不必要的代码路径。我不认为它会在性能方面带来更好的结果,但是如果您想确保可以检查 IL 代码。

【讨论】:

只有在我们谈论 C# 时才会有 IL 代码,问题中没有指定。 假设一旦代码被编译/JIT 编译,就会有一个额外的路径,这并不准确。您必须实际编译它,看看您的编译器是否如此愚蠢。当然,我非常怀疑这是真的。现在编译器通常比我们程序员聪明。【参考方案3】:

没有足够的差异来证明使用丑陋的形式是合理的。

在这个特定的例子中比任何一个都好

For(i = 0; i < 1000; i+=2)

    ...    

因为根本不需要可分性检查。

【讨论】:

以上是关于在 if 语句内继续循环与在循环内使用 if 语句的否定的主要内容,如果未能解决你的问题,请参考以下文章

如何从while循环内的if条件中断while循环?

使用R中的for循环内的if语句将字符串组折叠成一个字符串

综合练习题(if条件语句,while循环,奇数偶数

在一段时间内打破 if

带锁的循环内线程执行

r语言repeat语句内嵌套多层if语句的代码?