私はCを学んでいて、読んでいる本で以下にリストされている最初のループを見ました。私は2番目のものを使用することに慣れていて、異なる結果を返しても違いを理解できないので、2つの違いは何ですか。
for(i = 0; i < 10; ++i){}
for(i = 0; i <= 10; i++){}
私はCを学んでいて、読んでいる本で以下にリストされている最初のループを見ました。私は2番目のものを使用することに慣れていて、異なる結果を返しても違いを理解できないので、2つの違いは何ですか。
for(i = 0; i < 10; ++i){}
for(i = 0; i <= 10; i++){}
最初のものは まで反復し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 年前のコンパイラでは有効だった可能性がありますが、現在は無効になっています。
プレインクリメント/ポストインクリメント操作は、値を代入する際に使用する場合に機能します。
言う
i=10;
j = i++;
ここで の値はi
11 になりますが、 の値はj
10 になります。これは、値がPost Incrementi
に割り当てられた後に増加するためです。j
i=10;
j = ++i;
ここで、 の値はi
11 になり、 の値も 11 になります。これは、値がPre Incrementに割り当てられる前に増加するj
ためです。i
j
1 つ目はプリ インクリメント、2 つ目はポスト インクリメントです。
唯一のことは条件です。つまり、最初に 9 までチェックし、2 番目に 10 までチェックします。
両方のループで、インクリメント演算子はこの場合違いはありません
ほとんどの人は、反復回数が 1 だけ異なり、前後の増分はここでは何の違いもないことをすでに述べています。
c の場合、最初のループがより一般的に遭遇するものだと思います。その理由は、cがゼロベースの配列を使用しているため、配列の最大値(または文字の配列であるため文字列)が配列のインデックスとして使用されていないためだと思います(範囲外になります) )。したがって、この例で長さ 10 の配列をループする場合、i
配列のインデックスとして安全に使用できるため、最初のループがより論理的になります。2 番目のループはエラーになります (おそらくセグメンテーション違反)。
あなたは2番目のものに慣れていると言います。なぜあなたがそれに慣れているのかはわかりませんが、他のプログラミング言語か、数学ではループ (合計など) が限界まで実行される (ただし、多くの場合、1 から始まる) という事実を想定しています。このような場合、ゼロベースのインデックスは少しイライラすることがあります。
要するに、私の経験では、最初のループの方が頻繁に見つかりますが、2 番目のループには多くのユースケースがあります。
++i
vsについてi++
は、 for ステートメントのこの部分がループの最後に発生するため、私は後者に傾いています。したがって、後置記法はより論理的に感じられます。しかし、もう一度言いますが、それはあまり重要ではありません。
最初のものは10回実行されます。2 つ目は 11 回実行されます。