【发布时间】:2015-08-23 20:56:59
【问题描述】:
在下面的代码中,DO循环的上限在循环内被修改为
integer :: i1, i2, n1, n2
n1 = 4 ; n2 = 1
do i1 = 1, n1
do i2 = 1, n2
print *, "i1 =", i1, "i2 =", i2
n1 = 2
n2 = 2
enddo
enddo
gfortran4.8 和 ifort14.0 给出以下结果:
i1 = 1 i2 = 1
i1 = 2 i2 = 1
i1 = 2 i2 = 2
i1 = 3 i2 = 1
i1 = 3 i2 = 2
i1 = 4 i2 = 1
i1 = 4 i2 = 2
这表明边界在进入每个 DO 循环时是固定的(即 i1 的上限固定为 4,尽管在循环内将 n1 修改为 2)。这种行为与 C/C++ 的行为相反,其中相应的代码
int n1 = 4, n2 = 1;
for( int i1 = 1; i1 <= n1; i1++ )
for( int i2 = 1; i2 <= n2; i2++ )
{
printf( "i1 = %d i2 = %d\n", i1, i2 );
n1 = 2;
n2 = 2;
}
给予
i1 = 1 i2 = 1
i1 = 1 i2 = 2
i1 = 2 i2 = 1
i1 = 2 i2 = 2
这是合理的,因为 for 循环的定义(即开始、结束和递增条件)。所以我的问题是:是否可以假设 DO 循环的上述行为是通用的(= 由 Fortran 标准定义)或依赖于编译器(即与 ifort 或 gfortran 不同的编译器可能会表现不同)?
【问题讨论】: