2017-08-21 43 views
0

试想声明如下(从一个虚构类C语言)被脱成更简单的形式:for循环是否创建两个范围?

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

当然,症结是在初始化的int i = 0,怎么一回事,因为我们假设:

  1. 循环完成后,i超出范围,我们不能引用它。
  2. 在到达第2行,一个新的范围被压入堆栈上,然后弹出上线4

这将意味着该特定的for循环将desugar到:

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

主导创建一个范围,仅仅是为了包含增量变量。

我完全理解,具体细节是为任何允许在经典风格的循环中声明的语言定义的实现。我只是好奇它是如何在封面上工作的,至少在创建最初的AST时是如此。

回答

1

我认为这正是编译器为你做的。如果您尝试在LLVM上编译这两个代码,您可以看到这一点。用clang -S -mit-llvm并比较结果。