我正在使用gfortran编译器。另请告诉我,在执行自动类型转换(类型转换)时,gfortran是否使用Fortran标准之外的其他内容。
答案 0 :(得分:6)
分配由Fortran 2008第7.2节定义。值得注意的是Cl。 7.2.1.3第8段:
对于变量为数字类型的内部赋值语句,expr可能具有不同的数字 类型或种类类型参数,在这种情况下,expr的值将转换为类型和种类类型参数 根据表7.9的规则变量。
表7.9:数字转换和赋值语句
Type of variable Value Assigned integer INT(expr , KIND = KIND (variable)) real REAL(expr , KIND = KIND (variable)) complex CMPLX(expr , KIND = KIND (variable))
这意味着任何表达式(expr
)都将被隐式转换为它所分配的变量的类型和种类。对于字符类型,派生类型和其他任何内容,请参阅标准。
另请注意,Fortran仅在分配和初始化期间执行此类转换,但不执行过程调用等上下文。例如,请考虑以下过程:
subroutine sub1(a)
implicit none
integer :: a
print *, a
end subroutine
此过程具有integer类型的伪参数。例如,你不能这样做:
call sub1(1.d0)
因为这会导致实际和伪参数之间的类型不匹配。
但是,你可以这样做:
integer :: a
a = 1.d0 !implicitly interpreted as: a = INT(1.d0, kind=kind(a))
call sub1(a)
因为为赋值定义了隐式转换。
gfortran(5.1.0)中隐式类型转换标准的唯一记录扩展是在赋值期间在逻辑和整数类型之间。
.true.
转换为整数1
.false.
转换为整数0
0
已转换为.false.
.true.
请注意,如果您可以不使用旧版扩展程序,请不要使用它们。使用它们意味着您的程序不是标准的Fortran,因此任何编译器都可以自由地拒绝它。此扩展旨在允许遗留代码使用现代编译器进行编译,而不是用于新代码。