簡體   English   中英

for循環混亂

[英]For loop confusion

我有:

#include <stdio.h> 
int main(void) { 
int s,i,t[] = { 0, 1, 2, 3, 4, 5 }; 
s = 1; 
for(i = 2; i < 6 ; i += i + 1) 
s += t[i]; 
printf("%d",s); 
return 0; 
}

為什么結果是8?

我在想什么:

first loop: 2<6 True
i+=i+1 is 5
s=1+t[5] =>1+5=6
second loop : 5<6 True
i=5+5+2=11
s=6+t[11]???

循環增量表達式(在您的情況下i += i + 1 )發生循環體之后,而不是之前。

所以在第一次迭代中你做

s = 1 + t[2];

更一般地說,任何for循環都可以表示為while循環:

for (a; b; c)
{
    d;
}

相當於

{
    a;
    while (b)
    {
        {
            d;
        }
        c;
    }
}

對於您的具體情況,它是:

{
    i = 2;
    while (i < 6)
    {
        {
            s += t[i]; 
        }

        i += i + 1;
    }
}

我將引導您找到for循環參考

iteration-expression 在循環體之后計算,其結果被丟棄。 在評估 iteration-expression 之后,控制權轉移到 cond-expression。

在您的示例中, i += i + 1是我們正在討論的迭代表達式,在循環體之后進行評估。

考慮到這一點,結果將是 8

仔細看for循環中的第三個表達式

s = 1; 
for(i = 2; i < 6 ; i += i + 1) 
s += t[i];

它是i += i + 1 所以在循環的迭代中,變量i將按以下方式更改

i = 2 (initially)
i = 5 ( i += i + 1 => i += 2  + 1 => i += 3 => i = 2 + 3)

在循環的第二次迭代之后,變量i將已經大於6 (i += i + 1 => i += 5 + 1 => i += 6 => i = 5 + 6)

所以這個說法

s += t[i];

實際上產生以下總和

1 + t[2] + t[5] = 1 + 2 + 5

那等於8

暫無
暫無

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

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