for (int i = 0; i < 9; i++)
{
}
int i = 3; //定义这个i之后,上面for循环中的局部变量i会报错
为什么第二个变量i声明会导致for语句块中的i声明报错
如果把 int i = 3;放在for循环之前,那确实会导致变量已声明
但放在循环之后为什么还会影响之前的for中的i变量声明?
for (int i = 0; i < 9; i++)
{
}
int i = 3; //定义这个i之后,上面for循环中的局部变量i会报错
为什么第二个变量i声明会导致for语句块中的i声明报错
如果把 int i = 3;放在for循环之前,那确实会导致变量已声明
但放在循环之后为什么还会影响之前的for中的i变量声明?
这个你的怨汇编,因为方法进入后在一个栈内。而for语句在汇编里只是 jmp又不在另外的栈内,所以同一个栈的变量不能重复定义
所以别怨C#,别怨vs,别怨net,别怨微软,只能怪当初那些设计机器语言的为啥不按你的想法把循环也独立开个栈出来
补充一下,上面这是解释为啥同一方法内部不能重复定义变量的问题
不过课本上,编译原理大体分成词法分析和语法树编译两部分。好,现在我的问题是是,词法分析上为啥不能根据你的写法判定出他们前后不一样,从而当作2个变量定义呢
探索一下:
for (int i = 0; i < 6; i++)
{
}
for (int i = 0; i < 6; i++)
{
}
```这样是允许编译的,那么他又怎么回被判定为2个变量呢? 我大体猜测为词法分析时,他构造了不一样的vst。到底哪里不一样呢?一眼能看出来的不一样是花括号的代码段
so,我们在次验证
```c#
for (int i = 0; i < 6; i++)
{
}
{
int i = 3;
}
现在他能编译过去了,我们通过加花括号,“骗”过了词法分析部分,让他生成的语法树复合生成2个变量的vst(虽然你看上去是1个,但是其实他们栈里是2个)