符号表和作用域
symbol tables and scope
对于下面的代码,我试图为每个作用域绘制符号表。作用域是全局的、f1、else 和 f2。我想知道对于 f2,x 是否会被视为该作用域的符号。另外,f1(5) 是否与任何符号表相关联?
int x = 3;
int f1(int x) {
if (x > 4)
f1(x-1);
else {
int x = 1; f2();
}
}
int f2() {
print x;
}
f1(5);
使用关于作用域和变量声明的一些一般假设。
并非如此。符号仅在声明时添加到符号 table 中。由于您只使用 x
,因此不会将其添加到任何 table。所以你的问题有点没有意义。您的编译器会遇到符号 x
的使用,并在符号 table 中查找它。它将在全局范围内被发现为 x
。
f1(5)
并不真正与任何符号 table 相关联。由于您正在进行函数调用,因此您必须查找 f1
以确保它存在(并且参数 numbers/types 匹配)。你会在全局作用域的符号 table 中找到 f1
因为它在使用之前已经被定义了(另外,由于此时的代码只有一个作用域,全局,所以只有一个table 看看)。所以 f1(5)
只有在你会发现 f1
符号和符号 table.
中的参数信息的事实中关联
对于下面的代码,我试图为每个作用域绘制符号表。作用域是全局的、f1、else 和 f2。我想知道对于 f2,x 是否会被视为该作用域的符号。另外,f1(5) 是否与任何符号表相关联?
int x = 3;
int f1(int x) {
if (x > 4)
f1(x-1);
else {
int x = 1; f2();
}
}
int f2() {
print x;
}
f1(5);
使用关于作用域和变量声明的一些一般假设。
并非如此。符号仅在声明时添加到符号 table 中。由于您只使用
x
,因此不会将其添加到任何 table。所以你的问题有点没有意义。您的编译器会遇到符号x
的使用,并在符号 table 中查找它。它将在全局范围内被发现为x
。f1(5)
并不真正与任何符号 table 相关联。由于您正在进行函数调用,因此您必须查找f1
以确保它存在(并且参数 numbers/types 匹配)。你会在全局作用域的符号 table 中找到f1
因为它在使用之前已经被定义了(另外,由于此时的代码只有一个作用域,全局,所以只有一个table 看看)。所以f1(5)
只有在你会发现f1
符号和符号 table. 中的参数信息的事实中关联