在C#或Fortran 95循环中使用标记的break/continue?

3

我在一项作业任务中被要求将C#中的循环转换为Fortran 95。

outerLoop:
  for(row = 0; row < numRows; rows++){
    for(col = 0; col < numCols; col++){
      if(mat[row][col] == 0)
        continue outerLoop;
      sum += mat[row][col];
    }
  }

正如你们中的一些人所看到的那样,这与Java和Perl中使用的退出语句标签规范相似。据我了解,它们用于跳出具有嵌套循环或“if”语句的循环,而不仅仅是单个循环/语句。我对Java中的这个特性还很新,所以我不确定它是否存在于其他地方,特别是在C#和Fortran 95中。

我在谷歌上搜过,但没有找到相关信息。我很难制定搜索词,这也是其中的一个原因。

请注意:我不是在寻求答案;我只是想知道自己该去哪里找答案。

感谢您抽出时间阅读这篇文章。


2
我认为你正在寻找 goto:http://msdn.microsoft.com/zh-cn/library/13940fs2.aspx - Gabe
我不确定 continue outerLoop 具体是什么意思,但如果你在那个位置放置一个 break,它将会打破内部循环并允许外部循环继续执行。 - Cheeso
1
你真的想要了解C#中的跳转语句吗?请访问http://msdn.microsoft.com/en-us/library/d96yfwee.aspx。 - RichardOD
这个问题不太清楚。它是关于将(无效的)C#转换成Fortran还是(Java?)代码是否有相应的直接C#对应项?请参见"...将C#中的循环转换为Fortran 95。" - user166390
考虑到这段代码片段的可能结果,Fortran关键字很可能是HALT_AND_CATCH_FIRE。 - Hans Passant
2个回答

3

虽然我认为goto有其应用场景,但在这种情况下,命名循环比使用goto更好。+1 - mgilson

1

我相信在C#中不支持这样的break x功能。您需要使用标志手动跳出嵌套循环。

bool stop = false;
for (row = 0; row < numRows; rows++)
{
    for (col = 0; col < numCols; col++)
    {
        if (mat[row][col] == 0)
        {
            stop = true;
            break;
        }

        sum += mat[row][col];
    }

    if (stop)
        break;
}

更简单的替代方案包括使用goto语句(这被广泛地反对);或者将您的循环封装在一个专用方法中,在这种情况下,您可以在想要停止迭代时直接return

在查看了C#的跳转语句后,我得出结论:1)C#中不存在“继续到标签”,2)我的老师肯定给我们错误的指令/代码来解决问题,最终导致了错误的错误。 - Rxanadu
从你的例子中,我猜测你的老师指的是 goto 语句,在C#中是支持的,但强烈不建议使用,特别是在学术环境中,因为它违反了结构化编程的原则。 - Douglas
3
breakgoto有什么不同?也就是说,为什么使用break foo是可以的,而使用goto foo则不被鼓励? - Gabe
在C#(或我所知道的任何其他语言)中不允许使用“break foo”。通过“break x”,我指的是某些语言(如PHP)中允许指定“一个可选的数字参数,告诉它要退出多少个嵌套的封闭结构”的语法 - 请参见PHP:break - Douglas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接