0

次のステートメントを検討してください。

for (Container<Object>::Iterator it = container.begin(); it != container.end(); it++) {
    *loop_content*
}

対。

for (Container<Object>::Iterator it = container.begin(); it != container.end(); ++it) {
    *loop_content*
}

私の理解では、*loop_content* が何であるかに関係なく、上記の例のように for ループ内で使用された場合、プリインクリメント バージョンはポストインクリメント バージョンより悪くないことが保証されます。このステートメントがもはや真実ではなくなり、ポストインクリメントが実際にプレインクリメントよりも優れている例外や極端なコーナーケースはありますか?

そうでない場合は、ここで私が何年も疑問に思っていた、少し話題から外れた2 番目の質問があります。なぜ多くの教科書が、次のような例で for ループの使用を人々に教えているのですか。

for (int i = 0; i < 42; i++)

いいえ

for (int i = 0; i < 42; ++i)

私の推測では、いくつかの中世の言語には i++ のみが実装されていて ++i は実装されていないため、これらの言語に慣れている人々は反復子をインクリメントする方法にとどまっていると思いますが、この規則がどこから来たのかを知りたいと思っています。

4

2 に答える 2

2

私のコメントを詳しく説明するには、次のforようなループ

for (pre; cond; post) body

while次のループと同等です

{
    pre

    while (cond)
    {
        body
        post
    }
}

ご覧のとおり、postパーツはループ本体の内側にありwhileますが、ループ本体から分離されていforます。

于 2013-06-27T01:43:29.420 に答える
1

通常、ポスト インクリメントとプリ インクリメントは 2 つの点でのみ異なります。異なる値を返します。ポスト インクリメントは、変数のコピーを作成する必要があるため、わずかにコストがかかります。戻り値はforループで使用されないため、post- を pre- よりも優れたものにしたい場合は、奇妙でコストのかかる pre-increment 演算子を持つ新しいContainerクラスを発明する必要があります。Iterator何かのようなもの

operator++()
{
  ptr = ptr->next;
  // perform some undefined behavior, or just hash the Beijing telephone book
  return *this;
}

これは、単純な無能の結果として行うことができます。に何か悪いものを入れる本当の理由についてはoperator++()、私は困惑しています。

forPS私はかつて、ポストインクリメントが正しいと主張し、ループでプレインクリメントを使用すると異なる(間違った)結果が得られると主張した部下がいました。彼を繰り返し修正しても役に立ちませんでした。彼がこの仮説を非常に簡単にテストできたという事実は、何の違いもありませんでした。彼はどういうわけかソフトウェア エンジニアとして 10 年以上働いていましたが、それはうまくいきませんでした。

于 2013-06-27T01:56:20.277 に答える