编译器如何知道它超出了范围
本文关键字:范围 何知道 编译器 | 更新日期: 2023-09-27 17:57:01
Main()
{
int i =0;
...
...
while(true)
{
int k =0;
...
...
}
// K is out of scope..
}
编译器如何知道 K 超出范围?
编译器如何知道[局部变量]超出范围?
首先,让我们仔细定义您使用的术语。命名实体的范围是程序文本的区域,在该区域中,使用实体的名称是合法的,而无需对名称进行其他限定。
局部变量的作用域由规范定义为程序文本的区域,它是立即包含声明的整个块。
编译器通过跟踪与每个语法块关联的局部声明空间来确定局部变量的作用域。当我们需要解析一个名称时,我们会弄清楚名称用法在哪个块中,并查阅相关的声明空间。当然,块嵌套,局部变量声明空间也是如此,因此我们可能需要从内到外依次咨询多个
。我们使用的实际数据结构是简单的哈希表,针对编译器所需的各个方面进行快速查找和过滤进行了优化。(例如,我们有时需要查找名称,但只想获取类型,或者只想获取方法,依此类推。
这能回答你的问题吗?这是一个相当不清楚的问题。
因为当编译器处理代码时,它会维护有关它遇到的每个标识符和它遇到的每个范围的信息,并为后者维护边界。它知道 K 是在 while 作用域中声明的,并且在作用域结束后,它可能会将变量标记为"不再在作用域中",从而导致任何使用都被标记为错误。
k
超出了范围,因为它定义的块已关闭。
我会
说这是一个毫无意义的问题。K 超出了范围,因为你以这种方式编写程序:编译器的整个功能是识别和翻译编程语言,包括它的词法范围方面。