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

    cybrscot

    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

    gnasher729

    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. ulbador, Feb 25, 2011
    Last edited: Feb 25, 2011

    ulbador macrumors 68000

    ulbador

    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

    lee1210

    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

    Sydde

    Joined:
    Aug 17, 2009
    #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
    }
    This probably does not help you, but then again, it might.
     

Share This Page