Fortran编程中为何不推荐新程序使用DO WHILE循环?
Fortran中
DO WHILE循环相关疑问解答 首先明确核心结论:DO WHILE既不是不推荐的不良编程实践,也不存在任何运行速度上的劣势。
你看到的教材指引本质是基于结构灵活性的选型建议,而非强制编码规范:
Stephen Chapman在书中提到的“通用性更强的while循环”,指的是Fortran中无名
DO块搭配EXIT语句实现的循环结构。作者的推荐出发点是这种结构的场景适配范围更广,而非DO WHILE本身有语法缺陷、性能问题或者规范禁忌。
两种循环的实际差异
- 性能层面:两种写法在所有主流Fortran编译器(GNU Fortran、Intel Fortran、NVHPC等)开启常规优化后,会被编译为完全一致的机器指令,执行效率没有任何区别。你觉得
DO WHILE写法更整洁易用的感受完全合理:对于“循环入口处判断终止条件、循环体内部不需要额外中途退出”的场景,DO WHILE的语义更直白,代码可读性更强。 - 灵活性层面:无名
DO+EXIT结构的优势是支持在循环体的任意位置放置退出判断,甚至可以设置多个不同条件的退出分支,不需要把所有终止逻辑都集中在循环开头。比如读取输入后需要先校验输入格式合法性、再判断是否满足终止条件,或是循环执行中途遇到错误需要直接跳出时,这种结构不需要额外编写跳转逻辑,调整起来更方便。
两种写法参考示例
DO WHILE写法
INTEGER :: i = -1 DO WHILE (i < 0) PRINT *, 'Enter a non-negative number:' READ(*,*) i END DO
无名DO+EXIT写法
INTEGER :: i = -1 DO PRINT *, 'Enter a non-negative number:' READ(*,*) i IF (i >= 0) EXIT END DO
实际使用建议
不需要刻意教条遵循教材的替换要求:
- 如果你的循环是标准的“先判断条件、再执行循环体”逻辑,且没有循环中途退出的需求,完全可以继续使用
DO WHILE,不存在任何规范问题。 - 如果需要在循环体内部多个位置判断退出条件,再选择无名
DO+EXIT的结构即可。
注:不少Fortran教材中的这类建议,是沿袭Fortran 90刚推出块EXIT语法时期的编程习惯,并非当前必须遵守的强制编码规则。
内容的提问来源于stack exchange,提问作者baki
相关产品推荐
相关产品推荐

