Fortran DO循环计数器循环结束后取值有效性及使用合规性问询
嘿,这两个问题问到点子上了,刚好是Fortran里容易踩坑的细节,我给你理得明明白白:
问题1:DO循环计数器在循环结束后的值是否被语言标准保证有效?
得分两种情况来看,Fortran标准说得很清楚:
- 如果循环是正常跑完所有迭代的(没有被
EXIT、GOTO这类语句提前打断),那计数器变量的值是完全确定的——它等于最后一次循环体执行完后,按步长增量后的那个值(简单说就是刚好“超界”的那个数)。 - 如果循环是提前终止的(比如用
EXIT跳出来),那计数器的值就没谱了,标准没做任何保证,编译器爱怎么处理就怎么处理,这种情况下绝对不能用这个变量的值。
问题2:用J代替K输出循环次数,结果相同是巧合还是符合规则?
按照标准来说,这纯纯是巧合,甚至可能你测试时的场景有特殊情况。咱们来掰扯你的代码逻辑:
K = [算术表达式] do J = 1, K X(J) = [关于J的某函数] enddo write(*,*) 'Number of loops: ', J
假设K是正整数,循环正常跑完所有步骤:
- 一开始J被设为1,检查
1<=K,成立就执行循环体; - 每次循环体做完,J自动加1;
- 等J变成
K+1的时候,检查K+1<=K不成立,循环结束。
所以正常结束后J的值应该是K+1,而不是K——这才是标准规定的正确行为。
那你为啥会得到J和K一样的结果?大概率是这几种情况:
- 你在循环体里不小心改了J的值:比如那个“关于J的函数”里偷偷修改了J,最后把J变回了K;
- 循环提前终止了:比如循环体里有隐含的跳出逻辑(比如J=K时触发了某个条件用
EXIT跳出来),这种情况下J的值是未定义的,刚好等于K只是编译器的偶然表现; - 测试用了特殊值:比如你测了
K=0?但这时候循环根本不执行,J还是1,和K=0明显不一样;或者K=1?循环执行一次后J变成2,输出2和K=1也对不上。
总之,千万别依赖J的值来获取循环次数,用你最开始的思路——直接用K——才是靠谱的,毕竟K是你循环前明确赋值的变量,只要没在循环里改它,它的值就一直是确定的。
内容的提问来源于stack exchange,提问作者F90-Forever
相关产品推荐
相关产品推荐

