1. We have moved from vBulletin to XenForo and you are viewing the site in the middle of the move. Though the functional aspect of everything is working fine, we are still working on other changes including the new design on Xenforo.
    Dismiss Notice

incremental multiplication problem

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

  1. crazyNut

    crazyNut New Member

    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

    Just play a bit with operators and you will find out how to use to obtain correct result.
     
  3. jimblumberg

    jimblumberg New Member

    This link should help to explain the results. Sequence_point.

    Jim
     
    shabbir and crazyNut like this.
  4. crazyNut

    crazyNut New Member

    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

    The link was very useful.
    It contains some good points.

    Thanks
     
  6. xpi0t0s

    xpi0t0s Mentor

    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