簡體   English   中英

C#for循環和后增量

[英]C# for loop and post increment

我很難理解為什么以下循環在每次迭代時打印0。

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:             }

每次迭代后,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++ ...但理想情況下這樣做一個聲明本身,而不是在更大的聲明中使用它作為表達。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM