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日

悬赏问题

  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看