# Do I have the right answer to my question in C?

Discussion in 'Mac Programming' started by cybrscot, Feb 25, 2011.

1. ### cybrscot macrumors 6502

Joined:
Dec 7, 2010
Location:
Somewhere in Southeast Asia
#1
My book Question 10

10. Which one of the following statements is not equivalent to the other two (assuming that the loop bodies are the same)?

a) for (i =0; i < 10; i++)
b) for (i =0; i < 10; ++i)
c) for (i =0; i++ < 10; )

I choose c, obviously it looks different, but the expr2 which is the control expression is exactly the same for a and b. and they start testing with i = 0. Option c increments i, (adds 1 to i) before the test. So we're not testing 0 < 10 like a and b. We're testing 1 < 10.

Is this the correct answer and do I have the correct reason?

2. ### gnasher729 macrumors P6

Joined:
Nov 25, 2005
#2
Wrong reasoning. i++ increases i by one, but yields the old value. Each of the three loops will be executed exactly ten times (unless there is something in the loop body).

But consider the value of i within the body of the loop: What would be the output of
Code:
`printf ("%d\n", i);`
?

3. Feb 25, 2011
Last edited: Feb 25, 2011

Joined:
Feb 11, 2010
#3
C is the correct answer, but not for the reason you stated. The short of it is, A and B increment 'i' after printing it, C increments it before printing.

Set up a small test program, compile it and test it so you can see what happens. That is the best way to learn.

Code:
```

#include <stdio.h>

int main () {

int i;
for (i =0; i < 10; i++) {
printf("%d ",i);
}
printf("\n");
for (i =0; i < 10; ++i) {
printf("%d ",i);
}
printf("\n");
for (i =0; i++ < 10; ) {
printf("%d ",i);
}
printf("\n");
return 0;
}
```
There are 100 different ways of doing different types of counting in C (and related languages). Obviously answer C in this case is not very clear, so you would want to pick a method that is easy to read and understand while accomplishing what you want.

4. ### lee1210 macrumors 68040

Joined:
Jan 10, 2005
Location:
Dallas, TX
#4
Write this out on paper:

a) for (i =0; i < 10; i++)
First step: i is assigned the value 0
Second step: i is compared to 10, i is 0, pass.
Third step: Execute loop body, i is 0
Fourth step: i++, i is now 1
Fifth step: i is compared to 10, i is 1, pass
Sixth step: execute loop body, i is 1
Seventh step: i++, i is set to 2

b) for (i =0; i < 10; ++i)
First step: i is assigned the value 0
Second step: i is compared to 10, i is 0, pass.
Third step: Execute loop body, i is 0
Fourth step: ++i, i is now 1
Fifth step: i is compared to 10, i is 1, pass
Sixth step: execute loop body, i is 1
Seventh step: ++i, i is set to 2

c) for (i =0; i++ < 10; )
First step: i is assigned the value 0
Second step: i++ is compared to 10, i++ evaluates to 0, so 0 < 10 , pass. i set to 1
Third step: Execute loop body, i is 1
Fourth step: empty statement, i is now 1
Fifth step: i++ is compared to 10, i++ evaluates to 1, so 1 < 10 , pass. i set to 2

You can tell by the time you execute the loop body for the first time that C is different, as i is 1 for the first iteration, not 0 like the other two. I stopped, but it should take a few minutes for you to go through all 100 or so steps. At the end you can see what i's value is, and what the value of i was while executing the loop body each time.

-Lee

5. ### Sydde macrumors 68020

Joined:
Aug 17, 2009
Location:
Frogstar World B
#5
As has been mentioned in another thread, for is just convenient syntax for a while loop. Like this:

Code:
```for ( [I][COLOR="Green"]start[/COLOR][/I] ; [I][COLOR="DarkOrange"]test[/COLOR][/I] ; [I][COLOR="Purple"]cycle[/COLOR][/I] ) { [I][COLOR="blue"]loop body[/COLOR][/I]; )

// expands to:

[I][COLOR="green"]start[/COLOR][/I]; // initialize the variable
while ( [I][COLOR="DarkOrange"]test[/COLOR][/I] ) {
[I][COLOR="Blue"]loop body[/COLOR][/I]; // all the statements in the loop
[I][COLOR="purple"]cycle[/COLOR][/I]; // increment the variable, or whatever
}```