phimiler 2021-09-30 10:44 采纳率: 33.3%
浏览 45
已结题

方法中的变量作用域问题


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

      }
int i = 3;  //定义这个i之后,上面for循环中的局部变量i会报错

为什么第二个变量i声明会导致for语句块中的i声明报错
如果把 int i = 3;放在for循环之前,那确实会导致变量已声明
但放在循环之后为什么还会影响之前的for中的i变量声明?

  • 写回答

5条回答 默认 最新

  • wanghui0380 2021-09-30 11:38
    关注

    这个你的怨汇编,因为方法进入后在一个栈内。而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个)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 10月17日
  • 已采纳回答 10月9日
  • 创建了问题 9月30日

悬赏问题

  • ¥20 关于#stm32#的问题,请各位专家解答!
  • ¥15 (标签-python)
  • ¥15 第一个已完成,求第二个做法
  • ¥20 搭建awx,试了很多版本都有错
  • ¥15 java corba的客户端该如何指定使用本地某个固定IP去连接服务端?
  • ¥15 activiti工作流问题,求解答
  • ¥15 有人写过RPA后台管理系统么?
  • ¥15 Bioage计算生物学年龄
  • ¥20 如何将FPGA Alveo U50恢复原来出厂设置哇?
  • ¥50 cocos2d-x lua 在mac上接入lua protobuf?