为了更好地了解程序性编程,无论是实际还是学术用途,我都试图澄清CONTINUE和BREAK语句对状态的影响。
我已经明白,GOTO基本上是被禁止的,因为如果你是一个优秀的程序员,你可以找到一个更好的方法。但是我也在更深层次上理解,在程序编程中要避免它,因为它缺乏改变状态的能力。
这是我感到困惑,怎么继续,BREAK可以改变状态?
我最初的想法是,因为GOTO就是这样:
GOTO A;
LBL A;
不评估任何表达式,也不更改状态。并结合CONTINUE的形式:
while (evalFunction(*value) == 1) {
..
if ( bail == 1 ) continue;
..
}
能够在while条件下改变状态。
然而,这并不能解释BREAK。
有人可以提供有关程序编程细节的更多细节吗?
答案 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结构内部循环和/或扭曲逻辑,以便循环退出条件可以在循环的顶部进行测试。