0
试想声明如下(从一个虚构类C语言)被脱成更简单的形式:for循环是否创建两个范围?
1| for (int i = 0; i < 10; ++i)
2| {
3| // do work
4| }
当然,症结是在初始化的int i = 0
,怎么一回事,因为我们假设:
- 循环完成后,
i
超出范围,我们不能引用它。 - 在到达第2行,一个新的范围被压入堆栈上,然后弹出上线4
这将意味着该特定的for循环将desugar到:
{
int i = 0;
while (i < 10)
{
// do work
++i;
}
}
主导创建一个范围,仅仅是为了包含增量变量。
我完全理解,具体细节是为任何允许在经典风格的循环中声明的语言定义的实现。我只是好奇它是如何在封面上工作的,至少在创建最初的AST时是如此。