1

假设我有一种类似 algol 的语言,具有静态类型和以下代码:

a := b + c * d;

其中a是浮点数、b整数、c双精度和d长整数。然后,语言将转换d为 long 来操作c,并转换b为 double 来操作c*d结果。因此,在那之后, double 结果b+c*d将转换为 float 以将结果分配给a. 但是,当它发生时?我的意思是,所有转换都发生在运行时还是编译时?

如果我有:

int x; //READ FROM USER KEYBOARD.
if (x > 5) {
    a:= b + c * d;
}
else {
    a := b + c;
}

上面的代码有条件。如果编译器在编译时转换它,某些部分可能永远不会运行。这个对吗?

4

1 回答 1

2

您不能在编译时进行转换,就像在编译时进行加法一样(除非编译器可以确定变量的值,可能是因为它实际上是常量)。

编译器可以(并且确实)发出带有添加和乘以变量值的指令的程序。如果有必要,它还会发出指令,在计算之前将存储值的类型转换为不同的类型。

在编译时没有固定变量类型的语言必须在运行时执行检查并有条件地将值转换为不同的类型。但我不认为包含在“类似 Algol”的一般类别中的任何语言都是这种情况。

于 2017-01-29T21:16:40.600 回答