方法中的变量作用域问题


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个)

这跟int i=3放在前面和后面没有关系,这是编译的时候报错,又不是运行的时候。

for (int i = 0; i < 9; i++)
    {
    }
    int i = 3; 

这样写不会报错啊。for中的int i的作用域只在for循环内,出了for循环就被回收了。
int i=3;这里的int i的作用域是在for循环的下面,两者没有冲突,不会报错的。


如果是下面这样写的话就会报错:

int i;  //这里已经声明了i
for (i = 0; i < 9; i++)
    {
    }
    int i = 3;  //这里重复声明了,会报错。

for (int i = 0; i < 9; i++)
{
}
int i = 3;

这样写是会报错的,因为i在封闭局部范围中(for循环中)用于定义的局部变量。

确实不明白编译器咋想的, for(int i) {} 循环外面呢又不能调用 i ,也不能 命名 i 。