[英]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.