web-dev-qa-db-ja.com

配列の事前増分と事後増分

私はプログラミングを学び、C言語から始めました。 Let me Cの本を読んでいました。そして、私はその本の中でこのプログラムを経験していました。

main( ) 
{ 
 int a[5] = { 5, 1, 15, 20, 25 } ; 
 int i, j, k = 1, m ; 
 i = ++a[1] ; 
 j = a[1]++ ; 
 m = a[i++] ; 
 printf ( "\n%d %d %d", i, j, m ) ; 
}

私の理解は、それが印刷されますi as 2j as 1およびm as 15

しかし、どういうわけかそれはi as 3j as 2およびm as 15?なぜそうなのですか?

以下は私の理解です

b = x++;
In this example suppose the value of variable ‘x’ is 5 then value of variable ‘b’ will be 5 because old value of ‘x’ is used.

b = ++y;
In this example suppose the value of variable ‘y’ is 5 then value of variable ‘b’ will be 6 because the value of ‘y’ gets modified before using it in a expression.

私の理解に何か問題はありますか?

21
user2442489

あなたは頭に釘を打ちました。あなたの理解は正しいです。前と後のインクリメント式の違いは、まるで聞こえます。事前増分とは、式が設定または評価される前に変数が増分されることを意味します。ポストインクリメントとは、式が設定または評価され、変数が変更されることを意味します。これを2ステップのプロセスと考えるのは簡単です。

b = x++;

本当に:

b = x;
x++;

そして

b = ++x;

本当に:

x++;
b = x;

編集:あなたが提供した例のおそらくトリッキーな部分(おそらくあなたを驚かせた)は、配列のインデックスとその値の間に大きな違いがあるということです。

i = ++a[1];

つまり、a [1]に格納されている値をインクリメントし、それを変数iに設定します。

m = a[i++];

これは、mをa [i]の値に設定し、iをインクリメントすることを意味します。 2つの違いはかなり大きな違いであり、最初は混乱する可能性があります。

2番目の編集:コードの内訳

{ 
 int a[5] = { 5, 1, 15, 20, 25 } ; 
 int i, j, k = 1, m ; 
 i = ++a[1] ; 
 j = a[1]++ ; 
 m = a[i++] ; 
 printf ( "\n%d %d %d", i, j, m ) ; 
}

最初:

i = ++a[1];

この時点で、a [1] = 1であることがわかります(配列のインデックスは0であることを忘れないでください)。ただし、最初にインクリメントします。したがって、i = 2です。

j = a[1]++;

前にa [1]をインクリメントしたため、現在は2です。j= 2に設定し、THENを3にインクリメントしたため、j = 2になり、a [1] = 3になりました。

m = a[i++];

I = 2がわかっているので、m = a [2]を設定して、iをインクリメントする必要があります。この式の最後では、m = 15、i = 3です。

要約すれば、

i = 3, j = 2, m = 15.
37
Eric Wich

あなたの理解は正確ではありません。プリインクリメントおよびポストインクリメント演算子は単項演算子です。

したがって、最初にb = 5の場合、++ bまたはb ++はbの値を6にインクリメントします。ただし、代入演算子「=」を使用している場合、preとpostの違いが生じます。

そう、

if b=5
a=b++ // after this statement a=5 and b=6 as it is post increment
c=++b // after this statement c=7 and b=7

明確に理解するために、上記のステートメントを次のように分割できます。

a=b;  
b=b+1; //post increment  
b=b+1; //pre increment  
c=b;`  

だから、あなたが与えた例:

main( )    
{      
 int a[5] = { 5, 1, 15, 20, 25 } ;     
 int i, j, k = 1, m ;  
 i = ++a[1] ; // a[1] = 2 and i = 2  
 j = a[1]++ ; // j = 2 and a[1] = 3  
 m = a[i++] ; // m = a[2++] = 15, i now becomes 3  
 printf ( "\n%d %d %d", i, j, m ) ; // so i =3, j= 2 and m =15  
}

明確にするために、上記のコードを複数のステートメントに分割しています。

main( )    
{      
 int a[5] = { 5, 1, 15, 20, 25 } ;     
 int i, j, k = 1, m ;
 a[1] = a[1] + 1;  
 i = a[1];  
 j = a[1];  
 a[1] = a[1] + 1;  
 m = a[i]; // m = a[2] = 15  
 i = i + 1;  
 printf ( "\n%d %d %d", i, j, m ) ; // so i =3, j= 2 and m =15  
}

上記の説明があなたの疑問とあなたが走っているプログラムの出力をクリアしてくれることを願っています。

5
Kartikeya Sinha

説明:

ステップ1: int a [5] = {5、1、15、20、25};変数arrはサイズ5の整数配列として宣言され、a [0] = 5、a [1] = 1、a [2] = 15、a [3] = 20、a [4に初期化されます。 ] = 25。

ステップ2: int i、j、m;変数i、j、mは整数型として宣言されます。

ステップ3: i = ++ a [1]; i = ++ 1になります。したがって、i = 2およびa [1] = 2

ステップ4: j = a [1] ++; j = 2 ++になります。したがって、j = 2およびa [1] = 3です。

ステップ5: m = a [i ++]; m = a [2]になります。したがって、m = 15であり、iは1ずつ増加します(i ++は2 ++を意味するため、i = 3)

ステップ6: printf( "%d、%d、%d"、i、j、m);変数i、j、mの値を出力します

したがって、プログラムの出力は3、2、15

1