-1

私はCを学んでいて、読んでいる本で以下にリストされている最初のループを見ました。私は2番目のものを使用することに慣れていて、異なる結果を返しても違いを理解できないので、2つの違いは何ですか。

for(i = 0; i < 10; ++i){}

for(i = 0; i <= 10; i++){}
4

5 に答える 5

6

最初のものは まで反復し9、2 番目は まで反復し10ます。それで全部です。

プリインクリメント操作とポストインクリメント操作に違いはありません。

両方のバージョンで生成された最適化されていないコード:

    for(int i = 0; i < 10; ++i)
00E517AE  mov         dword ptr [i],0  
00E517B5  jmp         wmain+30h (0E517C0h)  
00E517B7  mov         eax,dword ptr [i]  
00E517BA  add         eax,1  
00E517BD  mov         dword ptr [i],eax  
00E517C0  cmp         dword ptr [i],0Ah  
00E517C4  jge         wmain+53h (0E517E3h)  
    {
    }

    for(int i = 0; i <= 10; i++)
00E517E3  mov         dword ptr [i],0  
00E517EA  jmp         wmain+65h (0E517F5h)  
00E517EC  mov         eax,dword ptr [i]  
00E517EF  add         eax,1  
00E517F2  mov         dword ptr [i],eax  
00E517F5  cmp         dword ptr [i],0Ah  
00E517F9  jg          wmain+88h (0E51818h)  
    {
    }

したがって、ここでもパフォーマンスの低下はありません。i++よりも遅いという事実++iは真実ではありません (少なくともこのコンテキストでは、違いはありません)。たとえばint y = i++の場合は遅くなりますが、この場合、この 2 つは異なることを行いますが、ここではそうではありません。パフォーマンスの問題は、20 年前のコンパイラでは有効だった可能性がありますが、現在は無効になっています。

于 2012-09-11T09:26:18.750 に答える
1

プレインクリメント/ポストインクリメント操作は、値を代入する際に使用する場合に機能します。

言う

i=10;

j = i++;

ここで の値はi11 になりますが、 の値はj10 になります。これは、値がPost Incrementiに割り当てられた後に増加するためです。j

i=10;

j = ++i;

ここで、 の値はi11 になり、 の値も 11 になります。これは、値がPre Incrementに割り当てられる前に増加するjためです。ij

于 2012-09-11T09:32:51.433 に答える
1

1 つ目はプリ インクリメント、2 つ目はポスト インクリメントです。

唯一のことは条件です。つまり、最初に 9 までチェックし、2 番目に 10 までチェックします。

両方のループで、インクリメント演算子はこの場合違いはありません

于 2012-09-11T09:28:38.077 に答える
0

ほとんどの人は、反復回数が 1 だけ異なり、前後の増分はここでは何の違いもないことをすでに述べています。

c の場合、最初のループがより一般的に遭遇するものだと思います。その理由は、cがゼロベースの配列を使用しているため、配列の最大値(または文字の配列であるため文字列)が配列のインデックスとして使用されていないためだと思います(範囲外になります) )。したがって、この例で長さ 10 の配列をループする場合、i配列のインデックスとして安全に使用できるため、最初のループがより論理的になります。2 番目のループはエラーになります (おそらくセグメンテーション違反)。

あなたは2番目のものに慣れていると言います。なぜあなたがそれに慣れているのかはわかりませんが、他のプログラミング言語か、数学ではループ (合計など) が限界まで実行される (ただし、多くの場合、1 から始まる) という事実を想定しています。このような場合、ゼロベースのインデックスは少しイライラすることがあります。

要するに、私の経験では、最初のループの方が頻繁に見つかりますが、2 番目のループには多くのユースケースがあります。

++ivsについてi++は、 for ステートメントのこの部分がループの最後に発生するため、私は後者に傾いています。したがって、後置記法はより論理的に感じられます。しかし、もう一度言いますが、それはあまり重要ではありません。

于 2012-09-11T09:46:15.243 に答える
0

最初のものは10回実行されます。2 つ目は 11 回実行されます。

于 2012-09-11T09:28:16.080 に答える