标识符之间的循环依赖关系



我正在学习飞镖,我有问题。使用谷歌翻译。对于可能出现的不准确之处,我深表歉意。

class A {
// no errors when compile code
static int x = y;
static int y = x;
}
void main() {
/* compile error
int a = b;
int b = a;
*/
print(y);
print(x);
}
// no errors when compile code
int x = y;
int y = x;

如果使用非顶级标识符,则使用与 c/c++ 中相同的原则。如果标识符 a 使用标识符 b,则标识符 b 在代码中必须更高。

但是对于顶级标识符,情况有所不同。这样做可能是为了方便在函数、类(即奇怪情况)之间存在循环关系的情况下。这种情况的一个例子是这样的。如果两个变量相互引用,则会发生错误并发生递归初始化尝试。也就是说,变量的行为类似于相互调用的函数。

为什么局部变量
  1. 和非局部变量的行为不同?
  2. 为什么会发生递归?变量是否都被视为获取者/二传手?
  3. 代码的顶层,标识符可以相互引用,而它们在文件中的描述顺序无关紧要?
  4. 对于局部变量,上述原理是否适用C++?
  5. 对于静态类成员,与顶级变量相同的逻辑适用?

如果为 main 中的 x 变量赋值,则不会因递归而出错,在这种情况下,显然会忽略原始初始值设定项。

main() {
x = 1;
print(x);
print(y);
}
int x = y;
int y = x;

如果回答问题没有困难,请注明其编号。

简而言之:

因为局部变量是在语句执行
  1. 期间声明的,语句执行具有排序,而非局部变量不是。

  2. 是的。非局部变量是getter/setter。

  3. 正确。

  4. 是的。当地资源只有在声明执行后才能使用。

  5. 是的。

通常,在初始化变量之前无法读取变量。这意味着什么取决于变量。

当语句执行到达声明时,将初始化局部变量。这意味着在声明之前不能引用局部变量。没有初始值设定项表达式(如int x;)的不可为空的局部变量在执行时不会初始化。必须先对其进行分配,然后才能读取它。静态分析通常可以确定变量是否已初始化,这使得在明确分配变量之前访问变量成为编译时错误。 (参数是局部变量,在输入函数时始终初始化,因此它们更简单。

在语句代码之外,没有执行顺序,这就是局部和非局部变量行为不同的原因。

全局(顶级/静态,它们被视为相同)变量与初始值设定项表达式(Foo x = somethingFoo();)在首次读取或写入时被延迟初始化。这些声明的顺序无关紧要。如果变量没有初始值设定项,则它必须可为 null,并被视为具有= null作为初始值设定项(除非late)。

实例变量在创建对象时由构造函数初始值设定项列表初始化,这意味着当您引用对象时,它们始终被初始化。

标记为late的局部变量或实例变量在读取或写入时会延迟初始化,就像顶级变量一样。如果它没有初始值设定项表达式,则在写入变量之前读取它是运行时错误。

所有非局部变量都被视为一对 getter 和 setter(除非final和非late,那么它只是 getter)。

以下是声明变量的方法的快速摘要:

函数随时函数44late分配latestaticstaticstaticstatic分配分配latelate阅读
变量类型初始化可以分配
参数intx输入
finalint输入从x
本地intx;当明确分配到时。任何时间
int?x;执行时,null.任何时间
intx=4;执行时,随时
finalintx;何时明确分配。当绝对未分配时。
finalintx=4;执行时,从
intx;时。任何时间
intx=4;读取(到 4)或分配时。任何时间
分配时latefinalintx;任何时间,如果已分配,则抛出。
latefinalintx=4;阅读时,4永不
静态或顶级staticintx;无效
int?x;读取时,null或分配。任何时间。
intx=4;读取或分配时。任何时间
finalintx;无效
finalintx=4;读取或分配时。从不
staticlateintx;时。任何时候,如果没有分配,就会投掷。
staticlateintx=4;当读取(到 4)或分配时。任何时候,如果没有分配,就会投掷。
staticlatefinalintx;时。任何时间,如果已分配,则抛出。
staticlatefinalintx=4;阅读时,4永不
实例intx;由构造函数。任何时间
int?x;通过构造函数,如果不是其他构造函数,则null任何时间
intx=4;通过建设。任何时间
finalintx;按构造函数。从不
finalint?x;通过构造函数,如果不是其他构造函数,则null从不
finalintx=4;通过建设。从不
intx;按构造函数或分配时任何时间,如果未分配,则抛出
intx=4;通过构造函数,在读取或分配时任何时间,如果未分配,则抛出。
latefinalintx;按构造函数或分配时。任何时间,如果已分配,则投掷
latefinalintx=4;时。从不

最新更新