0

実践的および学術的使用の両方で手続き型プログラミングの知識を深めるために、CONTINUE ステートメントと BREAK ステートメントが状態に与える影響を明確にしようとしています。

あなたが優れたプログラマーであれば、より良い方法を見つけることができるアプローチを採用しているため、GOTOは基本的に禁止されていることを理解するようになりました。ただし、状態を変更する機能がないため、手続き型プログラミングでは避けるべきであることも、より深いレベルで理解しています。

これは私が混乱していたのですが、どうして CONTINUE と BREAK が状態を変えることができるのでしょうか?

私の最初の考えは、GOTO がそのようなものであるためです。

GOTO A;
LBL A;

式は評価されず、状態は変更されません。CONTINUE の形式と組み合わせると、次のようになります。

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

while 条件で状態を変更する機能があります。

ただし、これは BREAK を考慮していません。

誰かが手続き型プログラミングの詳細についてもう少し詳しく説明できますか?

4

1 に答える 1

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 構造や、ループの終了条件をループの先頭でテストできるようにロジックをゆがめるよりも優先されます。

于 2012-04-23T19:53:13.267 に答える