程序式编程中的GOTO,CONTINUE,BREAK,它们如何影响状态?

时间:2012-04-23 13:32:44

标签: c controls state flow procedural-programming

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

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

这是我感到困惑,怎么继续,BREAK可以改变状态?

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

GOTO A;
LBL A;

不评估任何表达式,也不更改状态。并结合CONTINUE的形式:

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

能够在while条件下改变状态。

然而,这并不能解释BREAK。

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

1 个答案:

答案 0 :(得分:4)

我不知道这种“改变状态的能力”来自何处。

代码的最高优点是可读性。 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结构内部循环和/或扭曲逻辑,以便循环退出条件可以在循环的顶部进行测试。