我正在使用gfortran编译器。还要告诉我gfortran在执行自动类型转换(类型转换)时是否使用了Fortran标准以外的东西。
赋值是在Fortran 2008 Section 7.2中定义的。值得注意的是Cl. 7.2.1.3第8段:
对于变量为数值类型的内部赋值语句,expr可以是不同的数值类型或类型类型参数,在这种情况下,expr的值被转换为类型和类型类型参数
表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
这个过程有一个整数类型的虚拟参数。例如,您不能这样做:
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)中隐式类型转换标准的唯一文档扩展是在赋值期间在逻辑类型和整数类型之间进行转换。
见:https://gcc.gnu.org/onlinedocs/gcc-5.1.0/gfortran/Implicitly-convert-LOGICAL-and-INTEGER-values.html Implicitly-convert-LOGICAL-and-INTEGER-values
- 逻辑
.true.
转换为整数1
- 逻辑
.false.
转换为整数0
- 整型
0
转换为.false.
- 其他整数转换为
.true.
请注意,如果您可以不使用遗留扩展,那么就不要使用它们。使用它们意味着您的程序不是标准的Fortran,因此任何编译器都可以自由地以不正确为由拒绝它。这个扩展是为了允许遗留代码在现代编译器中编译,而不是在新代码中使用。