C#中作用域与初始化的问题

如图1,for循环使用局部值初始化了d,而在循环外试图访问d,产生了错误,这个可以理解。然而如图2,当把for去掉,但同样使d在局部作用域中赋值,为什么这时在外部就可以访... 如图1,for循环使用局部值初始化了d,而在循环外试图访问d,产生了错误,这个可以理解。然而如图2,当把for去掉,但同样使d在局部作用域中赋值,为什么这时在外部就可以访问d了?d的值不应该仍然是局部作用域中的值么?另外,如图3,为什么当这段语句处于死循环中时,就可以通过编译?可以看到后面的Console处于不可访问状态,是不是C#编译器只考虑可以访问的代码的正确性,无视根本访问不到的代码? 展开
 我来答
Aupryyyyyyyyyy
2016-08-24 · TA获得超过1636个赞
知道大有可为答主
回答量:1574
采纳率:53%
帮助的人:958万
展开全部
根据编译时的情况来看,for 块里的代码到底会不会执行,是未知的,因为 for 的第二项条件(i != 2)是否为 true 是要等到运行时才能知道的,编译时不可能知道
那也就是说,因为编译时对 d 的初次赋值是否会发生是不确定的,所以之后的代码编译就会出错
而你第二张图的代码,那个块里的代码肯定会被执行的,所以编译就不会出错
至于第三张图,我想或许是因为编译器把 while(true) 看作是一定会执行的,所以也不会出错了
更多追问追答
追问
按这么理解确实说得通。但是从作用域的角度解释,书上说for循环里对d的初始化是用的局部变量,出了局部作用域,在外部就无法获取d的内容了。那为什么普通的局部作用域不可以达到这样的效果呢?
追答
当然可以获取 d 啊,因为你的 d 是在作用域外声明的啊
除非,你在 for 块里又定义一个同名的 d,那这个 d 就会覆盖作用域外的 d
2b金夕
2016-08-24 · TA获得超过287个赞
知道小有建树答主
回答量:768
采纳率:0%
帮助的人:345万
展开全部
第一张图片是因为你是使用了没有初始化的变量
第二张图片你的这种写法就是d的作用域里边进行了赋值
第三章图片是因为你写了一个死循环 后边的代码被标记为不可到达的语句

其他不懂可以追问
追问
第二个图里,花括号里的作用域难道不是局部作用域么?为什么是d的作用域?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式