incremental multiplication problem

Discussion in 'C' started by crazyNut, Nov 21, 2010.

  1. crazyNut

    crazyNut New Member

    Joined:
    Nov 21, 2010
    Messages:
    6
    Likes Received:
    0
    Trophy Points:
    0
    Hi everyone,

    I am a beginner of C and am stuck on a problem like below

    int i=3, j, k;
    j = i++*i++;
    k = ++i*++i;
    print ("j=%d k=%d", j, k);

    As per my calculations the values should be j=12 and k=42 but the value of the code turns out to be j=9 and k=49. I don't understand why it happens. Can anyone explain the reason.

    Thanks for any Help
     
  2. ihatec

    ihatec New Member

    Joined:
    Sep 1, 2010
    Messages:
    20
    Likes Received:
    3
    Trophy Points:
    0
    Just play a bit with operators and you will find out how to use to obtain correct result.
     
  3. jimblumberg

    jimblumberg New Member

    Joined:
    May 30, 2010
    Messages:
    120
    Likes Received:
    29
    Trophy Points:
    0
    This link should help to explain the results. Sequence_point.

    Jim
     
    shabbir and crazyNut like this.
  4. crazyNut

    crazyNut New Member

    Joined:
    Nov 21, 2010
    Messages:
    6
    Likes Received:
    0
    Trophy Points:
    0
    Is it something like in case of i++
    the compiler first evaluates the expression
    j = i++*i++
    and then increments i 2 times in a row
    and opposite for ++i
    means there it first increments i 2 times in a row and then evaluates the exp k = ++i*++i


    Thanks
     
  5. crazyNut

    crazyNut New Member

    Joined:
    Nov 21, 2010
    Messages:
    6
    Likes Received:
    0
    Trophy Points:
    0
    The link was very useful.
    It contains some good points.

    Thanks
     
  6. xpi0t0s

    xpi0t0s Mentor

    Joined:
    Aug 6, 2004
    Messages:
    3,009
    Likes Received:
    203
    Trophy Points:
    63
    Occupation:
    Senior Support Engineer
    Location:
    England
    No. Look again at the definition of a sequence point. It is a point after which all side effects are guaranteed to have been completed. It is *NOT* a point before which all side effects are guaranteed NOT to have been completed. Before a sequence point, some side effects may or may not have been completed and you have no way of knowing which have and which haven't.

    So i=3; j=i++ * i++;
    could mean j=i(3, post incremented to 4) * i(4, post incremented to 5)=12,
    OR it could mean j=i*i(post incremented twice to 5)=9.
    The result is compiler dependent. In Visual Studio j=i++*i++; is equivalent to j=i*i; i++; i++; but you cannot guarantee this for all compilers (or even all versions of Visual Studio).

    The end result of this is that if you only need a variable once in an expression, it's safe to use modifiers, but if you need it more than once, use it WITHOUT pre/post increment/decrement within the expression, THEN modify it.

    By the way, this is a very frequently asked question. Check out stuff like the C++ FAQ before asking anything else. It will almost certainly answer your next 20 questions, plus there will be a load of other interesting stuff in there, so it's well worth a read.
     

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