Skip to content

编译确定量

在编译过程中,编译器会对一些编译器可以确定的变量进行优化,例如

mcfpp
int i = 5;
int j = 5;

print(i + j);

这个时候,编译器就会知道ij的值,因此可以直接计算出i+j的值为10,而且在print函数中,也可以直接输出10,而不用再转换为记分板的原始JSON文本了。

这种变量,在MCFPP中叫做编译确定量(Concrete Var)。编译确定量和普通变量是可以相互转换的,例如:

mcfpp
int i = 5;
dynamic j;
i = j;

在这个例子中,虽然开始的时候编译器能追踪i的值,但是在后面的代码中,i的值被赋值为j,而j被关键字dynamic修饰,表示这个变量在声明的时候是不确定的,因此编译器就会丢失对i的值的追踪。

同理,如果一个普通变量,被赋值为了一个确定的值,或者被赋值为一个编译确定量,那么编译器就能够获取这个变量的值,这个变量也就因此成为了编译确定量。

值得注意的是,编译器永远不会追踪类的成员变量。即使类的成员变量被赋值为一个确定的值,编译器仍然会将它作为普通变量进行处理。