7
int n = 5;
for(int i = 0;i!=n;i++)//condition !=
{
//executing 5times
}

int n = 5;
for(int i = 0;i<n;i++)//condition <
{
//executing 5times

}

Which one is preferred?

This was example from "Accelerated C++ : practical programming by example / Andrew Koenig, Barbara E. Moo." Just wanted to know why the Author prefers the first one

4

12 に答える 12

14

二番目。2つの理由から

  1. より小さい (または場合によっては <=) は、ほとんどのコーダーがこれらを記述する通常の方法であり、可能であれば慣習に従う方がよいでしょう。 < すぐにわかります。

  2. != は正確な条件に依存します。メンテナンス中にループの内部が変更され、ループ内で誤ってインクリメントされた場合、無限ループになってしまいます。一般に、終了条件をできるだけ広くすることは常に良いことです - それは単により堅牢です.

2はもちろん1の理由です。

于 2009-01-25T10:22:25.333 に答える
3

<より幅広い条件を捉えていると言えます。n が定数ではなく、まれに -1 を返す関数から返されたとします。その場合、ループの != バージョンを使用すると、(int が -ve 値にラップするまで!) はるかに長いループになります。

于 2009-01-25T10:18:54.047 に答える
3

を使用condition <すると、センチネル値を超えて無限ループに陥る可能性が減るため、はるかに優れています。

于 2009-01-25T10:23:01.450 に答える
2

質問にあるように、両方のループは同等です。ただし、実際のコードでは、物事がもう少し複雑になるのが一般的であり、その場合、「i < n」条件は少し安全になる傾向があります。たとえば、i が 1 を超えて増加する可能性がある場合、n を超えて「i != n」バージョンが永久ループになる可能性があります。

これは防御的プログラミングのケースです。それは普遍的に受け入れられているわけではありません: バグが早期に発見されるように、可能な限り見事に失敗することを好む人もいます。防御的なスタイルは、そのような小さな問題を隠している可能性があります。ただし、すべてのバグをキャッチしたい場合は、次のようにすることもできます。

int n = 5;
int i = 0;
while (i != n) {
    int old_i = i;
    // the real stuff of the loop here
   ++i;
   assert(i == old_i + 1);
}

(または、さらに良いのは、事前条件と事後条件およびループ不変条件をネイティブに指定するための構文をサポートする言語を使用することです。)

この種の質問について熟考したい場合は、Andrew Koenig による本「C Traps and Pitfalls」(初心者はhttp://en.wikipedia.org/wiki/C_Traps_and_Pitfallsを参照) がおそらく興味深いでしょう。

于 2009-01-25T10:25:40.117 に答える
1

<n is the most used (my opinion)

于 2009-01-25T10:16:41.197 に答える
1

私は通常、< を使用して 2 番目の方法を実行します。しかし、C++ の stl イテレータがこのように機能するため、!= を使用することを考えてください。

于 2009-01-25T10:23:15.037 に答える
1

二番目。ある時点で常に完了します (ループ内でカウンターの値をいじるなど、おかしなことをしていないと仮定します)。

少なくとも、そのように使用されていない最初のものを見たことがありません。

于 2009-01-25T10:24:10.183 に答える
1

< を使用することをお勧めします。コードを見るだけでループが増加していることがわかるため、i++ を使用しているという事実を裏付けることができます。

i++ と < を使用していて、何らかの理由 (他のコーダー、タイプミス、人的ミス) でコードがインクリメントを i に変更する場合、ループが評価されていないことがすぐにわかります。いずれにせよ、デバッグが簡単ではなくなります。

于 2009-01-25T10:55:40.947 に答える
0

私にはそれが重要であることがわかりません。もっと重要なことを心配する必要はありませんか?

私は常に後者を使用していますが、それが最も多く見られたものです。

誰かが私を撃ち落とすだろうけど....

于 2009-01-25T10:16:45.457 に答える
0

「i < n」の方が良いです。「i != n」を使用すると、場合によっては最初の i が n よりも大きくなり、無限ループに入るからです。

于 2009-01-25T10:35:08.053 に答える
0

速度を最適化する場合は、これがより良い代替手段であると思います。

int n = 5;
for(int i = n;i > 0;i--)
{
//executing 5times
}

その理由は、0 と比較する方が速いからです。

于 2009-01-25T10:38:09.953 に答える