【问题标题】:Can I omit If() statements if they are only used to check a condition for a while() loop?如果仅用于检查 while() 循环的条件,我可以省略 If() 语句吗?
【发布时间】:2020-03-13 05:22:15
【问题描述】:

在一个已解决的练习中看到了这一点。 while 循环不是有条件的吗?即使我不需要else 语句后缀,同时使用if 块和while 循环是否更好?

int main(void) {
    int foo = 10;

    if (!foo) {
        while (!foo) {
            foo--;
        }
    }
    return 0;
}

我会这样写代码:

int main(void) {
    int foo = 10;

    while (!foo) {
        foo--;
    }
    return 0; 
}

【问题讨论】:

  • 这不可能是整个代码,因为您展示的内容毫无意义。也许有另一个操作应该在!foo时执行一次。
  • 我编写了这段代码作为示例。实际代码比这大得多,但相关部分的转录是准确的(使用If 条件的方式)。我知道这段代码实际上毫无意义,我只是想简化它,因为我的问题是针对一件小事。
  • 你的意思是!!foo 吗?...因为块被跳过了。

标签: c if-statement optimization while-loop


【解决方案1】:

是的。如果是多余的。在第一个版本中,您会无缘无故地检查同一件事 2 次。

【讨论】:

    【解决方案2】:

    在某些实现中,可能存在以下性能差异:

    if (x) do
      ... loop body
    while(x);
    

    和

    while(x)
      ... loop body
    

    例如,前者可以翻译为:

    START:
      if (!x) goto EXIT;
      ... loop body
      if (!x) goto START
    EXIT:
    

    而后者会产生:

    START:
      if (!x) goto EXIT;
      ... loop body
      goto START
    EXIT:
    

    或

      goto LOOPEND
    LOOPSTART:
      ... loop body
    LOOPEND:
      if (x) goto START
    

    在带有if 的版本中,零重复案例包含一个分支,N 重复案例将包含 N-1 个分支和两个不分支。第一个替代版本,零重复案例将采用一个分支,而 N 次重复案例将包含 N 个无条件跳转和 N-1 个不采用分支。在第二个替代版本中,零重复情况将有一个无条件跳转和一个不采用分支,而 N 重复情况将包含一个无条件跳转、N 个分支采用和一个不采用分支。

    带有if 的版本将生成更大的代码,但执行的指令比任何直接生成的替代方案都少。现代编译器可能会将两个版本的源代码“优化”为相同的机器代码,这可能代表也可能不代表程序员尝试做的最佳时间/空间权衡。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-18
      • 2012-03-03
      • 1970-01-01
      • 2015-05-19
      • 2019-04-04
      • 2011-02-24
      • 2018-05-27
      相关资源
      最近更新 更多