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 ghpython这里总是报错而且rhino视图窗口内不显示怎么办
  • ¥15 布尔运算推导,请证明
  • ¥15 有没有人会打学生成绩管理系统呀
  • ¥15 在使用Fiddler和夜神模拟器抓包的时候一直出现443该怎么办啊QAQ搜了好几个笔记都没有解决
  • ¥15 3x7的二维数组A、B、C,A中的任意1个数组元素与B的任意1个数组元素、同时又与C的任意1个数组元素比较,把不同位置出现相同数的比较称为无意义,反之称为有意义,把有意义的比较打印输出。
  • ¥20 预测模型怎么处理原始数据(随机森林)
  • ¥20 请问discuz3.5如何实现插入ckplayer全能播放器功能呢?
  • ¥15 thingsboard代码编译出错误
  • ¥15 博途v18仿真报错怎么解决
  • ¥15 欧姆龙plc枕式包装机 ST编程