little confusion

Discussion in 'C' started by answerme, Jan 18, 2008.

  1. answerme

    answerme New Member

    Joined:
    Dec 17, 2007
    Messages:
    114
    Likes Received:
    0
    Trophy Points:
    0
    #include<stdio.h>
    main()
    {
    static int a[20];
    int i=0;
    a=i++;
    printf("%d %d %d",a[0],a[1],i);
    }

    output : 0 0 1

    My question is while incrementing i at
    a=i++;

    In output i value is 1 ,then why a[0] value is not incremented
    wont the output be 1 0 1
     
  2. technosavvy

    technosavvy New Member

    Joined:
    Jan 2, 2008
    Messages:
    52
    Likes Received:
    0
    Trophy Points:
    0
    a=i++;

    this is undefined behavior...
    the answer may change from compiler to compiler...try running the code on different compiler..

    this is technically a sequence point...just go through the link and you will understand it better..
    http://c-faq.com/expr/seqpoints.html
     
  3. asadullah.ansari

    asadullah.ansari TechCake

    Joined:
    Jan 9, 2008
    Messages:
    356
    Likes Received:
    14
    Trophy Points:
    0
    Occupation:
    Developer
    Location:
    NOIDA
    In the statement a= i++; a[0]=0 then i will increase to 1 .

    Now what will be a[1] to a[19] ????
    It's value will be zero as normal array. Now it does not matter what's value of i.

    i.e. Means a[1]=a[2]=a[3] .......=a[19]= 0;

    Rules of Array: If First element is initilized to any value then all next to this element will have zero value.

    Example:
    int a[20];
    a[2]=12;
    Then values of a[0], a[1] will be Garbage. a[2] will be 12. and a[3] to a[19] will be ZERO.
     
  4. asadullah.ansari

    asadullah.ansari TechCake

    Joined:
    Jan 9, 2008
    Messages:
    356
    Likes Received:
    14
    Trophy Points:
    0
    Occupation:
    Developer
    Location:
    NOIDA
    This program is running in GNU compiler(g++ & gcc). Only it depends On Array Implementation in compiler. As geven answer by me is tested on Solaris machine using gcc compiler.
     
  5. technosavvy

    technosavvy New Member

    Joined:
    Jan 2, 2008
    Messages:
    52
    Likes Received:
    0
    Trophy Points:
    0
    hi asadullah.ansari..
    there is no such rule...i have written a small code ..
    Code:
    int main( void )
    {
    int var[12];
    var[2] = 0;
    printf("%d%d",var[2], var[3] );
    return 0;
    }
    this code compiles with a warning in Visual Studio and crashed when run..
    and this code compiles with no warning using cc in Red Hat and gives garbage value for x[3] and not 0..

    the rule/standard is that if an array has been declared/defined as a static array then all its variable are initialized to zero..


    and about
    Code:
    a[i] = i++
    i am sure it is a sequence point ..as explained clearly in the link given by me in the earlier post .

    i believe that even you were talking about the case when variable are declared/defined as static.
     
  6. Salem

    Salem New Member

    Joined:
    Nov 15, 2007
    Messages:
    133
    Likes Received:
    5
    Trophy Points:
    0
    Occupation:
    Please don't PM me for 1:1 support.
    I think technosavvy's got this one nailed down :)

    > Only it depends On Array Implementation in compiler.
    There lies the problem. When you have an answer which doesn't work for everyone, it's a sure sign of implementation specific, unspecified or even undefined behaviour. Remember, undefined always includes doing what you expected (or perhaps wanted).

    This is even more true in small test case programs where it's all to easy to see behaviour which seems entirely plausible, but it is in fact specific to the compiler. For example, one could routinely get away with uninitialised pointers in small DOS programs, but scale up to a larger program and sooner or later, the mistake is exposed.
     

Share This Page

  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice