3

これは多くのゲーム エンジン コードで見られます。これは、for ループ本体で宣言した場合よりも高速になるはずですか? また、これには他の多くの for ループが続き、それぞれが同じ変数を使用します。

int i;
for(i=0; i<count; ++i)
{
}

for(int i=0; i<count; ++i)
{
}

ところで、私はこれを自分で行うことはありません。単にその背後にあるアイデアに興味があるだけです。パフォーマンスは別として、なぜ誰かがこれを行うのかがわからないからです。

4

5 に答える 5

15

最初の方法はおそらく C の方法、OLD OLD C の方法で、2 番目のバージョンは有効ではありませんでした。2 番目の方法を使用して、変数のスコープをできるだけ狭くします。

于 2012-10-31T01:26:26.427 に答える
3

forもともと、K&R C で、次のようなステートメントがあった場合

for (int i = 1; ...

{}後で同じメソッド(またはスコープ)でもう一度言うことはできませんでした

for (int i = 1; ...

そうしないと、「シンボルが重複しています」というエラーが発生します。

したがって、同じループ変数を再利用したい場合は、ループの外で宣言します。

C のその「機能」はとうの昔になくなっていますが、それでもループからbreak抜け出し、ループ インデックスを保持したい場合は、forステートメントの外側でループ変数を宣言する必要があります。

int i;
for (i = 1; ...
  do stuff;
  if (something) break;
}

x = y[i];
于 2012-10-31T01:31:07.977 に答える
2

ループの外側でループ インデックス変数を宣言する利点は何ですか?

前者の場合、iループ外の最後の値にアクセスできます。素朴な開発者は、値が の値になると言っていますcount。しかし、これをサンプリングする

int i;
for(i = 0; i < count; ++i)
{
   if (i == 2)
       break;

   //Loop Logic
}

そのような場合i= 2orになります< 2が、count が の場合はどうなりますか> 2

ただし、後者でiはループが終了するとすぐに範囲外になります

于 2012-10-31T01:26:45.613 に答える
2

K&R C は 2 番目のスタイルを受け入れませんでした。

最初のスタイルの利点の 1 つは、ループの後で 'i' にアクセスできることです。これは、特定のインデックスを検索する場合に重要になる可能性があります。

2 番目の利点は、より厳密なスコープであり、これは常に良いことです。'i's を混同することはできません。

于 2012-10-31T01:28:37.493 に答える
1

少なくとも 1 つのコンパイラ (MSVC の古いバージョン) が、ループの最後を超えてint iinの定義を漏らしました。for(int i = 0; i < max; ++i) { ... }一方、標準では、その範囲はforループ自体に限定されていると述べています。複数のコンパイラでコンパイルし、そのうちの 1 つで定義がリークし、もう 1 つはリークしなかった場合、後で同じコード本体で変数を再宣言すると、簡単に問題が発生する可能性があります。

そのため、変数宣言をループの外に置くことで、標準準拠のコンパイラと非標準準拠のコンパイラの両方で同じエラーが発生するコードを作成することを決定した人を見ることができました。

さて、別の理論は、プログラマーがループの終了後に反復変数の値にアクセスしたかったというものです。もう 1 つの可能性は、チームまたはコーダーが、変数宣言を独自の行に置くのが良いスタイルだと考えたことです。

于 2012-10-31T01:31:57.363 に答える