假设我有类似algol的语言,包含静态类型和以下代码:
a := b + c * d;
其中a
是一个浮点数,b
是一个整数,c
是一个双精度数,d
是一个整数。然后,该语言会将d
转换为long以使用c
,并b
加倍以使用c*d
结果。因此,在此之后,b+c*d
的双重结果将转换为float以将结果分配给a
。但是,当它发生时?我的意思是,所有的转换是在运行时还是编译时发生的?
如果我有:
int x; //READ FROM USER KEYBOARD.
if (x > 5) {
a:= b + c * d;
}
else {
a := b + c;
}
上面的代码有条件。如果编译器在编译时转换它,则某些部分可能永远不会运行。这是对的吗?
答案 0 :(得分:2)
您不能在编译时进行转换,只能在编译时进行添加(除非编译器可以确定变量的值,可能因为它实际上是常量)。
编译器可以(并且确实)发出一个程序,其中包含添加和乘以变量值的指令。如果有必要,它还会发出指令,在计算之前将存储值的类型转换为不同的类型。
在编译时没有固定变量类型的语言必须在运行时执行检查并有条件地将值转换为不同的类型。但是,我不相信包含在#34;类似Algol"的一般类别中的任何语言都是如此。