Loops &引用;良好的编程能力”;替换退出声明

Loops &引用;良好的编程能力”;替换退出声明,loops,fortran,Loops,Fortran,我有一个相当简单的结构: do i = 1,x if (condition) then do_stuff exit end if end do 如果do-循环变得足够大,那么exit语句就不会再好了(我对它的看法与我对goto语句的看法大致相同) 我正在寻找一种更干净的方法,以便在适当的时候退出循环,以便让其他人查看我的代码时也能更清楚地看到发生了什么 我想到的一件可能会清理干净的事情是 lkeepgoing = .true. iterator = 1 while

我有一个相当简单的结构:

do i = 1,x
  if (condition) then
    do_stuff
    exit
  end if
end do
如果
do
-循环变得足够大,那么
exit
语句就不会再好了(我对它的看法与我对
goto
语句的看法大致相同)

我正在寻找一种更干净的方法,以便在适当的时候退出循环,以便让其他人查看我的代码时也能更清楚地看到发生了什么

我想到的一件可能会清理干净的事情是

lkeepgoing = .true.
iterator   = 1
while (lkeepgoing) then
  if (condition) then
    do_stuff
    lkeepgoing = .false.
  end if
  iterator = iterator+1
end while
虽然我认为它澄清了为什么我不必查看整个循环就要退出循环,但我认为它看起来过于复杂了


所以问题是:当一个条件以一种清晰、干净的方式得到满足时,如何退出
do
-循环,而不使用意大利面条式的代码倾向语句?

您的第一个代码段使用
exit
的方式没有问题。像这样的小跳跃很难算是意大利面代码。与您的第二个代码片段相比,它更清楚地表明,当满足某个条件时,您正在严格地提前退出循环

请记住,
exit
非常局限于它可以跳转到的位置,而
go to
可以用于到处跳转


不要坚持一刀切的规则,比如永远不要太严格地使用goto,当然不要在它们使代码变得更糟糕的时候

第一个代码段使用的方式没有问题
exit
。像这样的小跳跃很难算是意大利面代码。与您的第二个代码片段相比,它更清楚地表明,当满足某个条件时,您正在严格地提前退出循环

请记住,
exit
非常局限于它可以跳转到的位置,而
go to
可以用于到处跳转


不要坚持一刀切的规则,比如永远不要太严格地使用goto,当然不要在它们使代码变得更糟糕的时候

如果有帮助,请将
exit
视为与
goto
非常不同,如果必须将其视为
goto
,则视为
goto
,其中目标必须位于非常特定且定义明确的位置。请注意,您的两个代码段的作用不同,在第一种情况下,您可能希望在if条件之前进行do_操作。然后,您还可以为退出指定一行:
if(condition)exit
。该标准甚至说,它将在while循环中完全执行此操作:如果循环控制为[,]while(标量逻辑表达式),其效果就好像省略了循环控制,并将以下语句作为do块的第一条语句插入:
If(.NOT.(标量逻辑表达式))退出
。除了HighPerformanceMark的建议外,有时您还可以使用
Dowhile
循环。我对结束的理由是:1。尽管另一个问题对
exit
break
)使用了不同的名称,但它是相同的,并且该问题不是特定于语言的(没有语言标记)。2.即使在当时,当规则更加宽松时,这个问题也被解决了。今天的关闭原因相当于“主要基于意见”。如果有帮助,请将
退出
视为与
转到
非常不同,如果必须将其视为
转到
,则目标必须位于非常特定和定义明确的位置。请注意,您的两个代码段所做的并不相同,在第一种情况下,您可能希望在if条件之前进行do_操作。然后,您还可以为退出指定一行:
if(condition)exit
。该标准甚至说,它将在while循环中完全执行此操作:如果循环控制为[,]while(标量逻辑表达式),其效果就好像省略了循环控制,并将以下语句作为do块的第一条语句插入:
If(.NOT.(标量逻辑表达式))退出
。除了HighPerformanceMark的建议外,有时您还可以使用
Dowhile
循环。我对结束的理由是:1。尽管另一个问题对
exit
break
)使用了不同的名称,但它是相同的,并且该问题不是特定于语言的(没有语言标记)。2.即使在当时,当规则更加宽松时,这个问题也被解决了。今天的闭包理由的等价物是“主要基于观点”。此外,还可能有命名循环。在这种情况下,流程更加清晰。循环开始时为
my\u super\u循环:do…
,结束时为
end do my\u super\u循环
。在该循环中,您可以使用
退出我的超级循环
。这对于嵌套循环特别有用。这也是我的想法。但是我的上司告诉我这是一种不好的做法,我不能使用它…我可以看到他的论点,但我找不到更好的方法…如果你必须遵守上司的规则,那么你不应该问他这个问题吗?还有,有可能有命名循环。在这种情况下,流程更为清晰。循环开始时为
my\u super\u循环:do…
,结束时为
end do my\u super\u循环
。在该循环中,您可以使用
退出我的超级循环
。这对于嵌套循环特别有用。这也是我的想法。但是我的上司告诉我这是一种不好的做法,我不能使用它…我可以看到他的论点,但我找不到更好的方法…如果你必须遵守上司的规则,那么你不应该问他这个问题吗?