在C / C ++语言中...用于循环内部编译为While循环?

时间:2011-11-20 03:39:07

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

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

4 个答案:

答案 0 :(得分:5)

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

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

可以改写为

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

请注意,这并未考虑范围限制和此类问题,因为当您将for转换为while时,无法使用C ++语法精确编写范围。

然而,在下面,for循环实际上是一系列语句和(条件)gotos:

{
           a;
           goto test;

    body:  
           ...;
           c;

    test:
           if (b) goto body:
}

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

答案 1 :(得分:2)

我想你可以这样想:

下式给出:

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

它生成这个模拟:

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

但重要的是要注意一些事情:

  1. 初始化是内部范围的一部分。因此,如果声明一个变量,它将不会在for循环之外转义。
  2. 无法跳过更新程序代码(除非跳出for循环)。这与while()循环不同,您可以continue通过自己的更新代码。即您有责任确保您的更新程序是否运行 - 但编译器会强制执行for循环。

答案 2 :(得分:2)

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

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

gcc -S -o your_asm_file.s your_src.c

然后查看*.s文件。这正是您的编译器正在编写的机器代码。

答案 3 :(得分:2)

发布完整性:

for (a; b; c) d;

相当于:

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