c++ - Fortran Do 循环的上限

标签 c++ loops fortran

在下面的代码中,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 的不同编译器可能表现不同)?

最佳答案

Fortran 标准规定 DO 循环的迭代次数在循环开始时是固定的,使用公式(至少到 F95,当能力被移除以使用非整数循环时控制表达式)

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

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

关于c++ - Fortran Do 循环的上限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32166126/

相关文章:

c++ - 为什么要使用更高的基础来实现 BigInt?

javascript - HTML 元素添加到 Javascript for 循环中,然后在计数器递增时删除

java - 检查嵌套循环中的缓冲区

python - 是否可以在 python 中进行类似 fortran 的打印?

c - 在结构中的数组末尾填充

c++ - 为什么这段代码在 VS Debug 模式下会执行 if...else 的两个分支

c++ - 缩小 unsigned int 到 short unsigned int 的转换

c++ - MinGW pacman -Sys 无法锁定数据库

javascript - 如何检查 Handlebars 中的对象是否为空if语句?

arrays - 在子程序调用期间保持 Fortran 中的数组限制