根据Fortran标准:
非指针伪参数的INTENT(OUT)属性指定在调用过程时未定义伪参数
但是这个简单的代码给了我5
作为输出,所以看起来参数在程序开始时没有被定义(在这种情况下是子程序)。
subroutine useless(a)
integer, intent(out) :: a
print *,a
end subroutine useless
program test
integer :: n=5
call useless(n)
end program test
我错了什么?似乎intent(inout)
和intent(out)
是相同的。
答案 0 :(得分:10)
intent(inout)
和intent(out)
肯定不一样。你已经注意到了为什么,虽然你没有得出正确的结论。在进入子例程useless
a
时,未定义,而不是定义。
变量“undefined”意味着在引用变量时不能依赖于特定的行为。您发现变量a
的值为5
,但这并不意味着您可以观察到的唯一值是5
。特别是“未定义”并不意味着“采用像NaN这样的特定值”。
由于对未定义变量的引用,您的代码不符合标准。请参阅Fortran 2008 6.2(类似的含义将在最初标记的Fortran 90中的某处)。特别值得注意的是编译器不必指出你的错误。
使用intent(inout)
时,变量a
将在引用时定义,并且保证其值5
(对于符合标准的处理器)。
更广泛地说,两个意图属性之间存在其他差异,而变量a
定义的相似性的这种“巧合”外观可能更加麻烦。
例如,可以释放具有延迟类型参数的可分配数组和对象;派生类型变为未定义(并且任何可分配的组件被释放)和具有默认初始化的组件被“重新初始化”;指针的关联状态变得不明确。
所有这些后面的东西都有可能产生非常尴尬的结果,比使用标量整数更有可能,如果它们被引用而没有先被定义。