编译器如何知é“它超出了范围?

时间:2011-05-17 23:31:45

标签: c# compiler-construction scope

Main()
{
  int i =0;
  ...
  ...
  while(true)
  {
   int k =0;
   ...
   ...
  }
// K is out of scope..
}

编译器如何知é“K超出范围?

4 个答案:

答案 0 :(得分:6)

  

编译器如何知é“[局部å˜é‡]超出范围?

首先,让我们仔细定义您正在使用的术语。命å实体的范围是程åºæ–‡æœ¬çš„区域,在该区域中使用实体å称是åˆæ³•çš„,无需é¢å¤–çš„å称。

本地å˜é‡çš„范围由规范定义为程åºæ–‡æœ¬çš„åŒºåŸŸï¼Œæ•´ä¸ªå— ç«‹å³åŒ…å«å£°æ˜Žã€‚

编译器通过跟踪与æ¯ä¸ªè¯­æ³•å—å…³è”的本地声明空间æ¥ç¡®å®šå±€éƒ¨å˜é‡çš„范围。当我们需è¦è§£æžä¸€ä¸ªå字时,我们会找出å称用法的内容,并查阅相关的声明空间。当然,å—嵌套,局部å˜é‡å£°æ˜Žç©ºé—´ä¹Ÿæ˜¯å¦‚此,因此我们å¯èƒ½éœ€è¦ä»Žå†…到外的顺åºæŸ¥è¯¢å¤šä¸ªã€‚

我们使用的实际数æ®ç»“构是简å•çš„哈希表,ç»è¿‡ä¼˜åŒ–,å¯å¿«é€ŸæŸ¥æ‰¾å’Œè¿‡æ»¤ç¼–译器所需的å„个方é¢ã€‚ (例如,我们有时需è¦æŸ¥æ‰¾å称,但åªæƒ³èŽ·å–类型,或仅获å–方法,等等。)

这会回答你的问题å—?这是一个相当ä¸æ˜Žç¡®çš„问题。

答案 1 :(得分:4)

因为当编译器处ç†ä»£ç æ—¶ï¼Œå®ƒä¼šç»´æŠ¤æœ‰å…³å®ƒé‡åˆ°çš„æ¯ä¸ªæ ‡è¯†ç¬¦çš„ä¿¡æ¯ä»¥åŠå®ƒé‡åˆ°çš„æ¯ä¸ªèŒƒå›´å¹¶ä¿æŒåŽè€…的边界。它知é“K在while范围内声明,并且在范围结æŸåŽå®ƒå¯èƒ½å°†å˜é‡æ ‡è®°ä¸ºâ€œä¸å†åœ¨èŒƒå›´å†…â€ï¼Œå¯¼è‡´ä»»ä½•ä½¿ç”¨è¢«æ ‡è®°ä¸ºé”™è¯¯ã€‚

答案 2 :(得分:1)

k超出了范围,因为它定义的å—已关闭。

答案 3 :(得分:1)

我会说这是一个毫无æ„义的问题。 K超出了范围,因为你编写了这样的程åºï¼šç¼–译器的整个函数是识别和翻译编程语言,包括它的è¯æ³•èŒƒå›´æ–¹é¢ã€‚