2016-12-26 10 views
4

次のループが各繰り返しで0を印刷する理由を理解するのに苦労しています。C#forループとポストインクリメント

for (int i = 0, j = 0; i < 10; i++) 
{ 
    Console.WriteLine(j += j++); 
} 

各繰り返しの後にjの値を大きくしないでください。あなたが説明してくださいできない場合は?

@Jon Skeetから肯定的なフィードバックを得た後、私はステートメントの分解を行い、コードがどのように低レベルで動作しているかを知ることができました。私は私のコメントに逆アセンブリを追加しました。

ありがとうございました!

54:     Console.WriteLine(j += j++); 
0000004f mov   eax,dword ptr [ebp-40h] /* [ebp-40h] == 0 move to eax */ 
00000052 mov   dword ptr [ebp-48h],eax /* eax == 0 move to [ebp-48h] */ 
00000055 mov   eax,dword ptr [ebp-40h] /* [ebp-40h] move to eax == 0 */ 
00000058 mov   dword ptr [ebp-4Ch],eax /* eax move to [ebp-4Ch] == 0 */ 
0000005b inc   dword ptr [ebp-40h]  /* increment [ebp-40h]== 1*/ 
0000005e mov   eax,dword ptr [ebp-48h] /* [ebp-48h] move to eax == 0 */ 
00000061 add   eax,dword ptr [ebp-4Ch] /* (eax == 0 + [ebp-4Ch]) eax == 0 */ 
00000064 mov   dword ptr [ebp-40h],eax /* eax == 0 move to [ebp-40h] */ 
00000067 mov   ecx,dword ptr [ebp-40h] /* [ebp-40h] move to ecx == 0 */ 
0000006a call  71DF1E00     /* System.Console.WriteLine */ 
0000006f nop 
    55:    } 
+0

@Rabid Penguin私はこれがRobert Sedgewick/Kevin Wayneのイントロプログラミングブックからの演習であると述べています。私は増分の前後の仕方を理解しています。私の目的は、各繰り返しでループが0を印刷した理由を理解することです。 – dcrearer

答えて

14

各反復の後にJの増加の値はべきではないでしょうか。

いいえ。あなたのループ本体はこれにやや同等です:

int tmp1 = j; // Evaluate LHS of += 
int tmp2 = j; // Result of j++ is the value *before* the increment 
j++; 
j = tmp1 + tmp2; // This is j += j++, basically 
Console.WriteLine(j); 

だから基本的に、あなたは、各反復でjを倍増している...しかし、jはで開始する0であるので、あなただけインクリメントしたい場合は、0としてとどまりますそれぞれの反復でjを使用してください。ちょうどj++ ...を使用してください。しかし、理想的には、より大きなステートメント内の式として使用するのではなく、単独でステートメントとして実行してください。

+0

ok ...ポストインクリメントはどの段階で実行されますか?私は実際に入門プログラミングの本から運動をしています。いいえ、その宿題はありません:)。ポストインクリメントが各反復を通じて値を増やすのは私の印象でした。 – dcrearer

+1

@dcrearer: 'j ++'式の評価の一部としてインクリメントされます。基本的に、 'j ++'は「インクリメント 'j」と評価されますが、結果は元の値です。 'j ++' *は 'j ++'をインクリメントしますが、 'j + ='部分のために 'j'に新しい値を代入すると、その効果は瞬時に起こります。あなたが 'Console.WriteLine(j ++);'を持っていればそれはうまくいくでしょうが、私はまだ 'j ++ 'を別のステートメントに動かすことを提案しています。 –

+0

フィードバックをいただきありがとうございます。 – dcrearer

関連する問題