C语言 For循环混淆

hivapdat  于 2023-01-29  发布在  其他
关注(0)|答案(3)|浏览(147)

我有:

#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]???
sbdsn5lh

sbdsn5lh1#

循环增量表达式(在您的例子中为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;
    }
}
ycggw6v2

ycggw6v22#

我将引导您进入for循环reference
iteration-expression在循环体之后求值,其结果被丢弃。在求值iteration-expression之后,控制被转移到cond-expression。
在您的示例中,i += i + 1(我们讨论的迭代表达式)在循环体之后求值。
考虑到这一点,结果将为8

ttisahbt

ttisahbt3#

注意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];

实际上得到了以下总和
其等于8

相关问题