在C/ c++语言…for循环在内部编译为While循环

In C/C++ Language... are for loop internally compile as While loop?

本文关键字:循环 在内部 编译 While for c++ 语言      更新时间:2023-10-16

In C/c++ Language…for循环内部编译为while循环?

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

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

可以重写为

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

注意,这并没有考虑作用域等问题,因为当你将for转换为while时,作用域不能用c++语法精确地写出来。

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

{
           a;
           goto test;
    body:  
           ...;
           c;
    test:
           if (b) goto body:
}

我想你可以这样想:

给定

:

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

生成如下模拟:

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

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

  1. 初始化是内部作用域的一部分。所以如果你声明了一个变量,它不会在for循环之外转义。
  2. 不能跳过更新程序代码(除非跳出for循环)。这与while()循环不同,在while()循环中,您可以通过自己的更新代码来continue。也就是说,你有责任确保你的更新程序是否运行-但编译器强制它用于for循环。

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

检查你的程序集(如果你使用的是gcc/g++):

gcc -S -o your_asm_file.s your_src.c

然后查看*.s文件的内部。

完整发布:

for (a; b; c) d;

等价于:

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