【问题标题】:GOTO, CONTINUE, BREAK in procedural programming, how do they effect state?程序编程中的 GOTO、CONTINUE、BREAK,它们如何影响状态?
【发布时间】:2012-04-23 13:32:43
【问题描述】:

为了更好地了解过程编程,无论是用于实际用途还是学术用途,我都试图阐明 CONTINUE 和 BREAK 语句对状态的影响。

我开始明白 GOTO 基本上是被禁止的,因为如果你是一个优秀的程序员,你可以找到更好的方法。但是我也更深层次地理解,在过程式编程中应该避免它,因为它缺乏改变状态的能力。

这是我弄糊涂了,怎么 CONTINUE 和 BREAK 可以改变状态?

我最初的想法是因为 GOTO 是这样的:

GOTO A;
LBL A;

不计算表达式,也不改变状态。并结合CONTINUE的形式:

while (evalFunction(*value) == 1) {
  ..
  if ( bail == 1 ) continue;
  ..
}

具有在while条件下改变状态的能力。

但这并不代表 BREAK。

有人可以提供有关过程编程的细节的更多细节吗?

【问题讨论】:

  • while 条件下“继续”如何改变状态? “break”会改变状态,因为条件根本不会被测试,这与改变条件的输出是一样的——至少在条件有副作用的情况下。否则,除了循环终止之外,不会更改任何状态。不过,我可能误解了您的要求。
  • 我对循环进行了编辑,继续可以通过调用条件中的函数来改变状态。老实说,我可能只是抓住了一些本应更像是“这是避免 GOTO 的众多原因中的另一个”。

标签: c controls state flow procedural-programming


【解决方案1】:

我不知道这种“改变状态的能力”是从哪里来的。

代码的最高优点是可读性。应避免使用 GOTO,因为它经常使代码难以阅读,而且没有其他原因。事实上,在某些情况下,使用 GOTO 的代码比避免使用 GOTO 时更容易阅读,在这些情况下,应该使用 GOTO。一个很好的例子是 C 嵌套清理习语:

int do_something()
{
   int rv = -1; /* failure */
   Foo *foo = get_a_foo();
   if (!foo) goto out;
   Bar *bar = get_a_bar();
   if (!bar) goto out_foo;

   rv = do_something_with_foo_and_bar(foo, bar);

   release_bar(bar);
out_foo:
   release_foo(foo);
out:
   return rv;
}

这比使用嵌套 if 语句的替代方案更容易阅读,因为它强调了正常的控制流。 (当然,在 C++ 中,您可以使用 RAII 代替,以减少混乱。)

同样,BREAK 和 CONTINUE 可以使代码更难阅读,应该避免这样做;但是,它们几乎适用于所有现代语言,因为它们通常使代码更容易阅读。因此,它们首选,而不是循环内的复杂 if-else 构造和/或扭曲逻辑,以便可以在循环顶部测试循环退出条件。

【讨论】:

  • 感谢您的回复。我非常熟悉可读性和 GOTO 语句的概念。但是,这并不能真正回答有关 BREAK 和 CONTINUE 的任何问题。
  • 我也关心状态,因为它是过程编程的基础,其目标是按照指令获得所需的状态变化。
  • 我想您可以将控制流的轨迹视为隐式状态变量(程序计数器)的演变,但我认为这不是一件有用的事情。无论如何,您似乎正试图为实际上是美学原理的东西找到一些分析基础,而且我认为 也不是一件有用的事情。我的意思是当我说“要避免使用 GOTO 没有其他原因,因为它经常使代码更难阅读”(相反,应该使用 BREAK 和 CONTINUE 没有其他原因 而不是它们通常使代码更易于阅读)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
  • 2015-12-09
相关资源
最近更新 更多