2

プログラミングを学びながら私が読んだすべてのチュートリアルと本を通して、配列を反復処理するための練習は常に次を使用する for ループでした。

int len = array.length();
for(int i = 0; i < len; i++) {//loop code here}

みんな使わない理由あるの?

for(int i = length(); i > -1; i--) {//loop code here}

私が見る限り、コードは短く、読みやすく、不要な変数を作成していません。状況によっては、配列を 0 から最後まで反復処理する必要があることがわかりますが、ほとんどの場合、方向によって違いはありません。

4

4 に答える 4

10

ほとんどの場合、方向は違いを生みません

確かに、例外がないと仮定すると、多くの場合、最終的に同じ結果が得られます。

しかし、コードが何をするかについて考えるという点では、通常は最初から最後まで考えたほうがはるかに簡単です。それは私たちが残りの人生で常にしていることです。

ああ、コードにバグがあります-length()初期値としてはほぼ確実に望んでいません-array.length() - 1そうでなければ、配列への無効なインデックスから始まるため、おそらく必要です(それは に修正length()した後でのみarray.length()です)。あなたこのバグを持っているという事実は、私の言いたいことを示しています: あなたのコードは、あなたが嫌い​​なコードよりもすぐに推論するのが難しい.

コードを読みやすく理解しやすくすることは、ほとんどの場合、追加の変数の小さな、ほとんど常に意味のないコードよりもはるか重要です。(言語は指定されていませんが、多くの場合、私自身のコードでは、反復ごとに呼び出して、最適化に任せます。)array.length()

于 2012-10-16T20:35:28.157 に答える
3

理由は読みやすさです。0 以上から列挙することは、ほとんどの人にとって最も理にかなっています。そのため、アルゴリズムが逆の反復を明示的に必要としない限り、これがほとんどの開発者にとってデフォルトの選択です。

今日のすべての一般的なプログラミング プラットフォームでは、追加の整数変数を宣言するコストはほとんどかかりません。

于 2012-10-16T20:35:36.440 に答える
1

使用するプラットフォームによって異なります。たとえば Java では、コンパイラの最適化が非常に優れているため、目立った違いがなくても驚かないでしょう。あらゆる種類のさまざまなトリックのベンチマークを行って、実際に何が高速で何が高速でないかを確認していました。経験則として、リソースを浪費しているという確固たる証拠がない場合は、Java の裏をかこうとしてはいけません。

于 2012-10-16T20:39:55.123 に答える
0

第一の理由は、あなたがそれについてどのように考えているかです。通常、人間は最初から最後まで繰り返しますが、その逆ではありません。

2 番目の理由は、この構文が C などの言語に由来することです。そのような言語では、場合によっては最後から最初に進むことがまったく不可能でした。最も明白な例は文字列 ( char*) で、通常は開始アドレスが提供されます。が見つかるまで列挙して、その長さを把握する必要がありまし0た。

于 2012-12-11T21:47:49.393 に答える