静态类型和转换
Static types and conversions
假设我有一种类似算法的语言,具有静态类型和以下代码:
a := b + c * d;
其中 a
是浮点数,b
是整数,c
是双精度数,d
是长整型。然后,该语言会将 d
转换为 long 以与 c
进行运算,并将 b
转换为 double 以与 c*d
结果进行运算。所以,之后,b+c*d
的double结果将被转换为float,将结果赋值给a
。但是,什么时候发生?我的意思是,所有转换都发生在 运行 时间还是编译时间?
如果我有:
int x; //READ FROM USER KEYBOARD.
if (x > 5) {
a:= b + c * d;
}
else {
a := b + c;
}
上面的代码有条件。如果编译器在编译时转换它,某些部分可能永远不会 运行。这是正确的吗?
您不能在 compile-time 处进行转换,就像您不能在编译时进行加法一样(除非编译器可以确定变量的值,也许因为它实际上是常量)。
编译器可以(并且确实)发出一个程序,其中包含对变量值进行加法和乘法运算的指令。如果有必要,它还会发出指令,在计算之前将存储值的类型转换为不同的类型。
没有固定变量类型的语言 compile-time 必须在运行时执行检查并有条件地将值转换为不同的类型。但我不认为 "Algol-like".
的一般类别中包含的任何语言都是这种情况
假设我有一种类似算法的语言,具有静态类型和以下代码:
a := b + c * d;
其中 a
是浮点数,b
是整数,c
是双精度数,d
是长整型。然后,该语言会将 d
转换为 long 以与 c
进行运算,并将 b
转换为 double 以与 c*d
结果进行运算。所以,之后,b+c*d
的double结果将被转换为float,将结果赋值给a
。但是,什么时候发生?我的意思是,所有转换都发生在 运行 时间还是编译时间?
如果我有:
int x; //READ FROM USER KEYBOARD.
if (x > 5) {
a:= b + c * d;
}
else {
a := b + c;
}
上面的代码有条件。如果编译器在编译时转换它,某些部分可能永远不会 运行。这是正确的吗?
您不能在 compile-time 处进行转换,就像您不能在编译时进行加法一样(除非编译器可以确定变量的值,也许因为它实际上是常量)。
编译器可以(并且确实)发出一个程序,其中包含对变量值进行加法和乘法运算的指令。如果有必要,它还会发出指令,在计算之前将存储值的类型转换为不同的类型。
没有固定变量类型的语言 compile-time 必须在运行时执行检查并有条件地将值转换为不同的类型。但我不认为 "Algol-like".
的一般类别中包含的任何语言都是这种情况