Main()
{
int i =0;
...
...
while(true)
{
int k =0;
...
...
}
// K is out of scope..
}
编译器如何知é“K超出范围?
ç”案 0 :(得分:6)
 Â编译器如何知é“[局部å˜é‡]超出范围?
首先,让我们仔细定义您æ£åœ¨ä½¿ç”¨çš„术è¯ã€‚命å实体的范围是程åºæ–‡æœ¬çš„区域,在该区域ä¸ä½¿ç”¨å®žä½“å称是åˆæ³•çš„ï¼Œæ— éœ€é¢å¤–çš„å称。
本地å˜é‡çš„范围由规范定义为程åºæ–‡æœ¬çš„åŒºåŸŸï¼Œæ•´ä¸ªå— ç«‹å³åŒ…å«å£°æ˜Žã€‚
编译器通过跟踪与æ¯ä¸ªè¯æ³•å—å…³è”的本地声明空间æ¥ç¡®å®šå±€éƒ¨å˜é‡çš„范围。当我们需è¦è§£æžä¸€ä¸ªåå—时,我们会找出å称用法的内容,并查阅相关的声明空间。当然,å—嵌套,局部å˜é‡å£°æ˜Žç©ºé—´ä¹Ÿæ˜¯å¦‚æ¤ï¼Œå› æ¤æˆ‘们å¯èƒ½éœ€è¦ä»Žå†…到外的顺åºæŸ¥è¯¢å¤šä¸ªã€‚
我们使用的实际数æ®ç»“构是简å•çš„哈希表,ç»è¿‡ä¼˜åŒ–,å¯å¿«é€ŸæŸ¥æ‰¾å’Œè¿‡æ»¤ç¼–译器所需的å„个方é¢ã€‚ (例如,我们有时需è¦æŸ¥æ‰¾å称,但åªæƒ³èŽ·å–类型,或仅获å–方法,ç‰ç‰ã€‚)
这会回ç”ä½ çš„é—®é¢˜å—?这是一个相当ä¸æ˜Žç¡®çš„问题。
ç”案 1 :(得分:4)
å› ä¸ºå½“ç¼–è¯‘å™¨å¤„ç†ä»£ç 时,它会维护有关它é‡åˆ°çš„æ¯ä¸ªæ ‡è¯†ç¬¦çš„ä¿¡æ¯ä»¥åŠå®ƒé‡åˆ°çš„æ¯ä¸ªèŒƒå›´å¹¶ä¿æŒåŽè€…的边界。它知é“K在while范围内声明,并且在范围结æŸåŽå®ƒå¯èƒ½å°†å˜é‡æ ‡è®°ä¸ºâ€œä¸å†åœ¨èŒƒå›´å†…â€ï¼Œå¯¼è‡´ä»»ä½•ä½¿ç”¨è¢«æ ‡è®°ä¸ºé”™è¯¯ã€‚
ç”案 2 :(得分:1)
k
è¶…å‡ºäº†èŒƒå›´ï¼Œå› ä¸ºå®ƒå®šä¹‰çš„å—已关é—。
ç”案 3 :(得分:1)
æˆ‘ä¼šè¯´è¿™æ˜¯ä¸€ä¸ªæ¯«æ— æ„义的问题。 Kè¶…å‡ºäº†èŒƒå›´ï¼Œå› ä¸ºä½ ç¼–å†™äº†è¿™æ ·çš„ç¨‹åºï¼šç¼–译器的整个函数是识别和翻译编程è¯è¨€ï¼ŒåŒ…括它的è¯æ³•èŒƒå›´æ–¹é¢ã€‚