根据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
Run Code Online (Sandbox Code Playgroud)
我错了什么?看起来intent(inout)和intent(out)都是一样的.
fra*_*lus 11
intent(inout)并且intent(out)是肯定不一样.你已经注意到了为什么,虽然你没有得出正确的结论.进入子程序时useless a未定义,而不是定义.
变量"undefined"意味着在引用它时不能依赖于特定的行为.您观察到该变量a具有值,5但这并不意味着您可以观察到的唯一值5.特别是"未定义"并不意味着"采用像NaN这样的特定值".
由于对未定义变量的引用,您的代码不符合标准.请参阅Fortran 2008 6.2(类似的含义将在最初标记的Fortran 90中的某处).特别值得注意的是编译器不必指出你的错误.
与intent(inout)可变a引用时将被定义并且将保证具有值5(对于符合处理器).
更广泛地说,两个意图属性之间存在其他差异,并且变量定义的相似性的这种"巧合"外观a可能更麻烦.
例如,可释放的可分配数组和具有延迟类型参数的对象被释放; 派生类型变为未定义(并且任何可分配的组件被释放)和具有默认初始化的组件被"重新初始化"; 指针的关联状态变得不确定.
所有这些后面的东西都有可能产生非常尴尬的结果,比标量整数更有可能,如果它们被引用而没有先被定义.