2017-01-29 63 views
0

假设我有一个类ALGOL语言,用静态类型和下面的一段代码:静态类型和转换

a := b + c * d; 

其中a是浮点数,b的整数,c双和d长。然后,语言将转换d长期与c进行操作,并b翻番与c*d结果进行操作。因此,在此之后,b+c*d的双重结果将被转换为浮点数,以将结果分配给a。但是,当它发生时,我的意思是,所有的转换是在运行时还是编译时间发生的?

如果我有:

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

上面的代码具有条件语句。如果编译器在编译时将其转换,则某些部分可能永远不会运行。它是否正确?

回答

1

你不能这样做在编译时比你可以做一个除了在编译时更多的转换(除非编译器可以判断变量的值,也许是因为它实际上是不变)。

编译器可以(并且不会)发射与添加和相乘的变量的值的指令的程序。如果需要,它还会发出指令,在计算之前将存储值的类型转换为其他类型。

不具有可变类型的固定在编译时语言都必须执行在运行时检查和有条件值转换为不同的类型。但我不认为“Algol-like”这一大类中包含的任何语言都属于这种情况。

+0

但是编译器知道变量的类型,这很重要变量中的值? –

+1

@TomiSebastiánJuárez:编译器可以发出执行转换的代码,因为它知道变量类型是什么。但它不能*做转换*,除非它也知道变量的值。它与'a + a'没有区别。如果编译器知道'a'中的值是'2',它可以进行加法并用'4'替换表达式。否则,它所能做的就是发出代码进行添加。 – rici

+0

非常清楚。谢谢 –