【问题标题】:In C/C++ Language... are for loop internally compile as While loop? [closed]在 C/C++ 语言中...... for 循环是否在内部编译为 While 循环? [关闭]
【发布时间】:2012-01-02 05:05:26
【问题描述】:

在 C/C++ 语言中...for 循环是否在内部编译为 while 循环?

【问题讨论】:

  • 已经提出了类似的问题,例如性能差异是什么。他们基本上是同一个问题。 stackoverflow.com/questions/2879145/…
  • 不是完全重复的。这专门询问 MS Visual C++,另一个问题似乎询问 g++/intel 编译器。

标签: c++ c visual-c++


【解决方案1】:

是的,通常,基本上。一个for循环,写的

for (a; b; c) { ... }

可以改写为

a;
while (b) { ...; c; }

请注意,这并没有考虑范围和此类问题,因为当您将 for 转换为一段时间时,范围不能精确地用 C++ 语法编写。

但是,在底层,for 循环实际上是一系列语句和(有条件的)goto:

{
           a;
           goto test;

    body:  
           ...;
           c;

    test:
           if (b) goto body:
}

除了所有这些都在汇编代码中。

【讨论】:

  • 您的循环可以使用更多大括号。 a 的作用域在循环中,我相信c 被更多的大括号隔开。
  • @Pubby 是的,我为此添加了评论,我只是在阅读另一个答案后才意识到这一点。但是如果你只是在它们周围添加 { } 就不是真的一样了,因为这将创建两个范围,而不仅仅是一个它实际上是这样的。我不认为它可以正确地写出来。
【解决方案2】:

我想你可以这样想:

给定:

for (initialization; condition; updater) { body; }

它生成这个类比:

{
  initialization;
  while (condition)
  {
     ... // body
     updater;
  }
}

但有几点需要注意:

  1. 初始化是内部作用域的一部分。所以如果你声明一个变量,它就不会逃出 for 循环。
  2. 无法跳过更新程序代码(除非跳出 for 循环)。这与 while() 循环不同,您可以在其中 continue 以自己的方式通过自己的更新代码。 IE。您有责任确保您的更新程序是否运行 - 但编译器会强制执行它以进行 for 循环。

【讨论】:

  • +1 表示第 2 点的贡献。细微的差别,但对我来说几乎没有任何意义。
【解决方案3】:

如何将循环生成到程序集中取决于您的编译器。一般来说,如果我要手动为循环编写代码,它们在程序集中看起来会略有不同。这些优化对于您的代码来说可能是次要的,但如果需要,您可以节省额外的加载/存储。但很可能你的循环条件(如果它们是计数器)无论如何都是在寄存器中完成的算术运算。

要检查你的程序集(如果你使用 gcc/g++)试试这个:

gcc -S -o your_asm_file.s your_src.c

然后查看*.s 文件的内部。这正是您的编译器将其分解为机器代码的内容。

【讨论】:

    【解决方案4】:

    为了完整性发布:

    for (a; b; c) d;
    

    相当于:

    {
      a;
      while(b)
      {
        {
          d;
        }
        c;
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-03-06
      • 2012-01-05
      • 2014-03-22
      • 2020-07-27
      • 2015-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多