在下面的代码中,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循环进入时边界是固定的(即,尽管n1在循环内被修改为2,但i1的上限固定为4)。这种行为与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的不同编译器可能表现不同)?
答案 0 :(得分:4)
Fortran标准指定DO
循环的迭代次数在循环开始时是固定的,使用公式(至少达到F95,当能力被移除以使用非整数循环控制表达式时,正如francescalus在评论中指出的那样)
iterations = MAX(0,INT((final-value - initial-value + step-size)/step-size)
这样做的一个结果就是您所看到的行为:更改用于控制循环体内循环的任何值都不会改变将要执行的迭代次数。