-6

I have :

#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; 
}

Why is the result 8?

What I'm thinking:

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]???
Vlad from Moscow
  • 301,070
  • 26
  • 186
  • 335
Ady Alex
  • 29
  • 5
  • 1
    Why don't you update `s` during first loop iteration? – Gerhardh Jan 25 '23 at 13:24
  • 1
    You seem to expect the `i += i + 1` part is executed before the loop body is executed. It is not. It is only executed afterwards, right before the condition is checked again. – Gerhardh Jan 25 '23 at 13:25

3 Answers3

2

The loop increment expression (i += i + 1 in your case) happens after the loop body, not before.

So in the first iteration you do

s = 1 + t[2];

More generally, any for loop could be expressed as a while loop:

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

is equivalent to

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

For your specific case it's:

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

        i += i + 1;
    }
}
Some programmer dude
  • 400,186
  • 35
  • 402
  • 621
1

I will guide you to the for loop reference:

iteration-expression is evaluated after the loop body and its result is discarded. After evaluating iteration-expression, control is transferred to cond-expression.

In your example, i += i + 1, which is the iteration expression we're talking about, is evaluated after the loop body.

Taking this into account, the result will be 8

1

Look attentively at the third expression in the for loop

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

It is i += i + 1. So in iterations of the loop the variable i will be changed the following way

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

After the second iteration of the loop the variable i will be already greater than 6. (i += i + 1 => i += 5 + 1 => i += 6 => i = 5 + 6)

So this statement

s += t[i];

in fact produces the following sum

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

that is equal to 8.

Vlad from Moscow
  • 301,070
  • 26
  • 186
  • 335