Fortran Do循环的上界

Upper bounds of Fortran Do loops

本文关键字:循环 Do Fortran      更新时间:2023-10-16

在下面的代码中,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和ifor14.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++相反,在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 = %dn", 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可能表现不同)?

Fortran标准指定DO循环的迭代次数在循环开始时固定,使用公式(至少在F95之前,当不能使用非整数循环控制表达式时)

iterations = MAX(0,INT((final-value - initial-value + step-size)/step-size)

这样做的一个后果是你看到的行为:改变任何用于控制循环体内循环的值都不会改变将要执行的迭代次数。