C:++i と i++ の違いは何ですか?

    <リ>

    ++i i の値を増やします 、そしてインクリメントされた値を返します。

     i = 1;
     j = ++i;
     (i is 2, j is 2)
    
    <リ>

    i++ i の値を増やします 、しかし元の値 i を返します インクリメントされる前に保持されます。

     i = 1;
     j = i++;
     (i is 2, j is 1)
    

for の場合 ループ、どちらでも動作します。 ++i おそらくそれが K&R で使用されているためです。

いずれにせよ、ガイドライン「prefer ++i」に従ってください i++以上

++i の効率に関するコメントがいくつかあります および i++ .学生プロジェクト以外のコンパイラでは、パフォーマンスの違いはありません。これは、生成されたコードを確認することで確認できますが、これは同一です。

効率の問題は興味深いです... これが私の答えの試みです:C の i++ と ++i の間にパフォーマンスの違いはありますか?

@OnFreund が指摘しているように、operator++() 以来、C++ オブジェクトでは異なります。 は関数であり、中間値を保持する一時オブジェクトの作成を最適化する方法をコンパイラが認識できません。


i++ ポストインクリメントとして知られています 一方、++i プレインクリメントと呼ばれます。

i++

i++ i をインクリメントするため、ポスト インクリメントです。 操作が終了した後、 の値を 1 ずつ減らします。

次の例を見てみましょう:

int i = 1, j;
j = i++;

j = 1 の値 しかし i = 2 . i の値 j に割り当てられます 最初に i 増加します。

++i

++i i をインクリメントするため、プリインクリメントです。 の値を操作前に 1 ずつ減らします。これは j = i; を意味します。 i++ の後に実行されます .

次の例を見てみましょう:

int i = 1, j;
j = ++i;

j = 2 の値 しかし i = 2 . i の値 j に割り当てられます i の後 i のインクリメント .同様に ++i j=i; の前に実行されます .

あなたの質問に対して、for ループのインクリメント ブロックで使用する必要があるのはどれですか? 答えは、どれでも使用できます..問題ではありません。 forループと同じ番号を実行します。

for(i=0; i<5; i++)
   printf("%d ",i);

そして

for(i=0; i<5; ++i)
   printf("%d ",i);

両方のループが同じ出力を生成します。すなわち 0 1 2 3 4 .

どこで使用しているかだけが重要です。

for(i = 0; i<5;)
    printf("%d ",++i);

この場合、出力は 1 2 3 4 5 になります .


どちらが速いかという「効率」(実際の速度)は気にしないでください。最近では、これらのことを処理するコンパイラがあります。意図をより明確に示すものに基づいて、使用する意味のある方を使用してください。