for循环是否创建了两个范围?

时间:2017-08-21 21:05:37

标签: for-loop language-agnostic control-flow

想象一下,以下语句(来自虚构的C语言)会变得更加简单:

1| for (int i = 0; i < 10; ++i)
2| {
3|     // do work
4| }

当然,关键点是初始化程序中的int i = 0,我们假设:

  1. 循环完成后,i超出范围,我们无法引用它。
  2. 到达第2行后,新的范围将被推入堆栈,然后在第4行弹出。
  3. 这意味着这个特定的for-loop会出现:

    {
        int i = 0;
        while (i < 10)
        {
            // do work
            ++i;
        }
    }
    

    导致创建范围的唯一目的是包含增量变量。

    我完全理解具体是针对任何允许在经典样式for循环中声明的语言定义的实现。我只是好奇这是否如何在幕后工作,至少在创建初始AST时。

1 个答案:

答案 0 :(得分:1)

我认为这正是编译器为您所做的事情。如果您尝试在LLVM上编译两个代码,则可以看到此信息,例如:使用clang -S -emit-llvm并比较结果。