web-dev-qa-db-ja.com

サイクルの事前増分と事後増分の違いは何ですか(for / while)?

私の興味は、forwhileループの違いにあります。ポストインクリメント値が使用されてからインクリメントされ、操作が一定のプレインクリメントを返すことを知っています。

while (true) {
    //...
    i++;
    int j = i;
}

ここで、jにはループの最後に古いiまたはポストインクリメントされたiが含まれますか?

18
user1886376

この例では、ステートメントi ++は;で終わるため、プリインクリメントを使用するかポストインクリメントを使用するかに違いはありません。

結果を利用すると違いが生じます。

int j = i++; // i will contain i_old + 1, j will contain the i_old.

対:

int j = ++i; // i and j will both contain i_old + 1.
44
zennehoy

それらの使用方法に依存します。

  • i++はコピーを作成し、iを増やし、コピー(古い値)を返します。
  • ++iはiを増やし、iを返します。

あなたの例では、速度がすべてです。 ++iは、コピーを作成しないため、i++よりも高速になります。

ただし、例ではインクリメント演算子から返された値を保存していないため、コンパイラはおそらく最適化を行いますが、これはintなどの基本型でのみ可能です。

37
Tim

理解のための基本的な答え。増分演算子は次のように機能します。

// ++i
function pre_increment(i) {
    i += 1;
    return i;
}
// i++
function post_increment(i) {
    copy = i;
    i += 1;
    return copy;
}

優れたコンパイラーは、戻り値が使用されないことを検出すると、自動的にi++++iに置き換えます。

21
Kulvar

プレインクリメントでは、初期値が最初にインクリメントされ、次に式内で使用されます。

a=++i;

この例では、変数iの値が5であり、変数aの値が6であると仮定します。なぜなら、iの値は式で使用する前に変更されるためです。

ポストインクリメントでは、値が最初に式で使用され、次にインクリメントされます。

a=i++;

この例では、変数iの値が5であり、変数aの値が5であると仮定します。なぜなら、iの値は、値5をa

6
Pbk1303
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char **argp)
{
    int x = 5;

    printf("x=%d\n", ++x);
    printf("x=%d\n", x++);
    printf("x=%d\n", x);

    return EXIT_SUCCESS;
}

プログラム出力:

x=6
x=6
x=7

最初のprintfステートメントではxがprintfに渡される前にインクリメントされるため、値6が出力され、2番目のxではprintfに渡され(したがって6が出力される)、その後インクリメントされ、3番目のprintfステートメントは直前のポストインクリメントを示す値7になったxを再度出力することにより、ステートメント。

4
Taha

i ++はiの値を使用してから増分しますが、++ iはiの値を増分してから使用します。

2
Naira Magdy

独立したステートメントでpreまたはpostインクリメントを使用するかどうかは関係ありませんが、pre-incrementを除いて効果は即時です

//an example will make it more clear:


int n=1;
printf("%d",n);
printf("%d",++n);// try changing it to n++(you'll get to know what's going on)

n++;
printf("%d",n);

出力:123

0
Oswin Topno

ポストインクリメントとプレインクリメントの違いは、多くの場合微妙です。ポストインクレムネット、別名num++、最初にnumのコピーを作成し、それを返しますそしてその後、それをインクリメントします。一方、プリインクリメント、別名++num、最初に評価してから値を返します。ほとんどの最新のコンパイラは、これをループで見ると、一般的に最適化されます。ほとんどの場合、ポストインクリメントが使用され、返された初期値は使用されません。微妙なバグを作成することが実際によくある2つの増分の最も大きな違いは、値を増分して変数を宣言する場合です。以下の例:

int num = 5;
int num2 = ++num; //Here, first num is incremented, 
                  //then made 6, and that value is stored in num2;

もう一つの例:

int num = 5;
int num2 = num++; //Here, num is first returned, (unfortunately?), and then 
                  //incremented. This is useful for some cases.

ここで最後に言いたいことは、増分に注意してくださいです。変数を宣言するときは、正しい増分を使用するか、すべてを書き出すようにしてください(num2 = num + 1、これは常に機能するとは限らず、事前インクリメントに相当します)。適切な増分を使用すると、多くのトラブルが軽減されます。

0
Arnav Borborah