Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
CODE PROJECT For Those Who Code
  • Home
  • Articles
  • FAQ
Community
  1. Home
  2. General Programming
  3. C / C++ / MFC
  4. Increment and Decrement Operators

Increment and Decrement Operators

Scheduled Pinned Locked Moved C / C++ / MFC
questionhelptutorial
24 Posts 8 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • M Marco Bertschi

    Richard MacCutchan wrote:

    but it is still worth avoiding expressions of that sort.

    Every respectable Dev must avoid it. By the way, my comment was intended to be an addition to yours.

    Veni, vidi, caecus | Everything summarizes to Assembly code

    L Offline
    L Offline
    Lost User
    wrote on last edited by
    #14

    Marco Bertschi wrote:

    my comment was intended to be an addition to yours.

    Yes, that was how I understood it. :thumbsup:

    Veni, vidi, abiit domum

    1 Reply Last reply
    0
    • S Suk nta

      no no..in any compiler prefix operator execute first than postfix. postfix will execute after value returned or assigned to some variable..

      L Offline
      L Offline
      Lost User
      wrote on last edited by
      #15

      See http://msdn.microsoft.com/en-us/library/126fe14k.aspx[^].

      Veni, vidi, abiit domum

      1 Reply Last reply
      0
      • T tgsb

        O God....wow I am not the only one who is confused? This is the problem I specified when I started this thread, I got surprising answers when i solve these inc and dec problems.So who is correct please tell me and whom explaination I go with to pursue my learning on this topic?

        OriginalGriffO Offline
        OriginalGriffO Offline
        OriginalGriff
        wrote on last edited by
        #16

        Pre- and post- fix increment and decrement operations are pretty easy in theory, it's only when people get creative that you get problems in practice. Basically, a prefix (++i or --i) says to increase or decrease the value before you use the variable, so the variable has the new value immediately:

        i = 10;
        x = ++i + 5;

        Can be read as:

        i = 10;
        i = i + 1;
        x = i + 5;

        and similarly for the -- version:

        i = 10;
        x = --i + 5;

        Can be read as:

        i = 10;
        i = i - 1;
        x = i + 5;

        The postfix version (i++ or i--) does the same thing, but after the variable has been used:

        i = 10;
        x = i++ + 5;

        Can be read as:

        i = 10;
        x = i + 5;
        i = i + 1;

        And similarly

        i = 10;
        x = i-- + 5;

        Can be read as:

        i = 10;
        x = i + 5;
        i = i - 1;

        The trouble comes when you start mixing operations on the same line (as Richard said):

        i = 10;
        x = ++i + i++;

        The problem is that the language specification does not define exactly when pre- and post- fix operations should occur! Which means that it's implementation specific exactly what you get as a result: The value of i should always be the same: 12 but the value of x can be different depending on the compiler (and to an extent on the target processor - ARM for example has built in pre- and post- fix increment and decrement to it's "machine code" LOAD operations, so it would be quite likely that an efficient compiler would use them directly) Should it be executed as:

        i = 10;
        i = i + 1;
        x = i + i;
        i = i + 1;

        Which gives the result 22 or as

        i = 10;
        i1 = i;
        i = i + 1;
        x = i1 + i;
        i = i + 1;

        Which gives 21 Or as

        i = 10;
        i1 = i;
        i = i + 1;
        x = i + i1;
        i = i + 1;

        which also gives 21 by a different route And bear in mind that the compiler does not have to evaluate the two operands of "+" in left to right order, so it could even give some very strange and unexpected results! Like 23... So avoid combining them: use them for "simple expressions" such as incrementing an array index each time round a loop, but don't get fancy, or your code may well fail in interesting ways... :laugh:

        Never underestimate the power of stupid things in large numbers --- Serious Sam

        "I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
        "Common sense is so rare these days, it should be classified as a super power" - Random T-shirt

        T 1 Reply Last reply
        0
        • S Suk nta

          hey i want to rectify Message send by Richard MacCutchan

          int i = 10;
          int result;
          result = i++; // result equals 10, i equals 11
          result = ++i; // result equals 12, i equals 12
          result = i--; // result equals 12, i equals 11
          result = --i; // result equals 10, i equals 10

          // note do not use expressions such as
          result = ++i + i++; // results undefined

          As written the last line gives output undefine i think its wrong .it will give correct output as 23.
          If u had checked then u already got the result.
          here i will explan u how it's work..

          1:from left to right ++i changes i values 10 to 11.
          2:then it will add 11 + 11 (as i++ is post increment operator it will execute after expression execution) and gives result as 22
          3: then i values becomes 22 and i++ will going to execute and i value changes to 22+1=23

          OriginalGriffO Offline
          OriginalGriffO Offline
          OriginalGriff
          wrote on last edited by
          #17

          You are making unwarranted assumptions! :laugh: It's more complex that that - Richard is right, you shouldn't mix 'em - see my post below for some compiler nasties...

          Never underestimate the power of stupid things in large numbers --- Serious Sam

          "I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
          "Common sense is so rare these days, it should be classified as a super power" - Random T-shirt

          S 1 Reply Last reply
          0
          • OriginalGriffO OriginalGriff

            Pre- and post- fix increment and decrement operations are pretty easy in theory, it's only when people get creative that you get problems in practice. Basically, a prefix (++i or --i) says to increase or decrease the value before you use the variable, so the variable has the new value immediately:

            i = 10;
            x = ++i + 5;

            Can be read as:

            i = 10;
            i = i + 1;
            x = i + 5;

            and similarly for the -- version:

            i = 10;
            x = --i + 5;

            Can be read as:

            i = 10;
            i = i - 1;
            x = i + 5;

            The postfix version (i++ or i--) does the same thing, but after the variable has been used:

            i = 10;
            x = i++ + 5;

            Can be read as:

            i = 10;
            x = i + 5;
            i = i + 1;

            And similarly

            i = 10;
            x = i-- + 5;

            Can be read as:

            i = 10;
            x = i + 5;
            i = i - 1;

            The trouble comes when you start mixing operations on the same line (as Richard said):

            i = 10;
            x = ++i + i++;

            The problem is that the language specification does not define exactly when pre- and post- fix operations should occur! Which means that it's implementation specific exactly what you get as a result: The value of i should always be the same: 12 but the value of x can be different depending on the compiler (and to an extent on the target processor - ARM for example has built in pre- and post- fix increment and decrement to it's "machine code" LOAD operations, so it would be quite likely that an efficient compiler would use them directly) Should it be executed as:

            i = 10;
            i = i + 1;
            x = i + i;
            i = i + 1;

            Which gives the result 22 or as

            i = 10;
            i1 = i;
            i = i + 1;
            x = i1 + i;
            i = i + 1;

            Which gives 21 Or as

            i = 10;
            i1 = i;
            i = i + 1;
            x = i + i1;
            i = i + 1;

            which also gives 21 by a different route And bear in mind that the compiler does not have to evaluate the two operands of "+" in left to right order, so it could even give some very strange and unexpected results! Like 23... So avoid combining them: use them for "simple expressions" such as incrementing an array index each time round a loop, but don't get fancy, or your code may well fail in interesting ways... :laugh:

            Never underestimate the power of stupid things in large numbers --- Serious Sam

            T Offline
            T Offline
            tgsb
            wrote on last edited by
            #18

            Thanks sir for highlighting its deep concepts related to the compiler. I hope now I am able to solve these question without getting shocked by their answers. Appreciate all your responses.

            OriginalGriffO 1 Reply Last reply
            0
            • T tgsb

              Thanks sir for highlighting its deep concepts related to the compiler. I hope now I am able to solve these question without getting shocked by their answers. Appreciate all your responses.

              OriginalGriffO Offline
              OriginalGriffO Offline
              OriginalGriff
              wrote on last edited by
              #19

              You're welcome!

              Never underestimate the power of stupid things in large numbers --- Serious Sam

              "I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
              "Common sense is so rare these days, it should be classified as a super power" - Random T-shirt

              1 Reply Last reply
              0
              • OriginalGriffO OriginalGriff

                You are making unwarranted assumptions! :laugh: It's more complex that that - Richard is right, you shouldn't mix 'em - see my post below for some compiler nasties...

                Never underestimate the power of stupid things in large numbers --- Serious Sam

                S Offline
                S Offline
                Suk nta
                wrote on last edited by
                #20

                I know increment and decrement operator depend on compiler. actually i had tried it in dev c++.

                OriginalGriffO 1 Reply Last reply
                0
                • S Suk nta

                  I know increment and decrement operator depend on compiler. actually i had tried it in dev c++.

                  OriginalGriffO Offline
                  OriginalGriffO Offline
                  OriginalGriff
                  wrote on last edited by
                  #21

                  If you know that something is compiler dependant, then you can't say "it is like this" - because there is a very good chance that the other person is not using the same compiler! :laugh:

                  Never underestimate the power of stupid things in large numbers --- Serious Sam

                  "I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
                  "Common sense is so rare these days, it should be classified as a super power" - Random T-shirt

                  S 1 Reply Last reply
                  0
                  • L Lost User

                    These operators merely add (inc) or subtract (dec) 1 from the item in question. If the operator is used in the postfix position (i++) then the original value is returned. If the operator is used in the prefix position (--i) then the new value is returned. Thus:

                    int i = 10;
                    int result;
                    result = i++; // result equals 10, i equals 11
                    result = ++i; // result equals 12, i equals 12
                    result = i--; // result equals 12, i equals 11
                    result = --i; // result equals 10, i equals 10

                    // note do not use expressions such as
                    result = ++i + i++; // results undefined

                    Veni, vidi, abiit domum

                    S Offline
                    S Offline
                    Stefan_Lang
                    wrote on last edited by
                    #22

                    Am I the only one to spot that at least one of the problems in your last line is not related to increment and decrement at all? The operator+ which is invoked here needs to evaluate both of its operands, but it's undefined whether the first or second operand is evaluated first - the compiler may choose to do either! So, if the compiler evaluates the first operand first, the following happens:

                    i = 10;
                    i = i + 1; // pre-increment of the first argument
                    first_arg = i;
                    second_arg = i;
                    i = i + 1; // post-increment of the second argument
                    result = first_arg + second_arg; // 11 + 11

                    Now consider the same on the assumption the compiler evaluates the second operand first:

                    i = 10;
                    second_arg = i;
                    i = i + 1; // post-increment of second argument
                    i = i + 1; // pre-increment of first argument
                    first_arg = 1;
                    result = first_arg + second_arg; // 12 + 10

                    In this case, the results are the same, but that is just by coincidence - if you had used subtraction in stead of addition you'd be in for a surprise! You may want to check http://en.cppreference.com/w/cpp/language/eval_order[^] for further information regarding both function argument evaluation and increment/decrement.

                    GOTOs are a bit like wire coat hangers: they tend to breed in the darkness, such that where there once were few, eventually there are many, and the program's architecture collapses beneath them. (Fran Poretto)

                    L 1 Reply Last reply
                    0
                    • S Stefan_Lang

                      Am I the only one to spot that at least one of the problems in your last line is not related to increment and decrement at all? The operator+ which is invoked here needs to evaluate both of its operands, but it's undefined whether the first or second operand is evaluated first - the compiler may choose to do either! So, if the compiler evaluates the first operand first, the following happens:

                      i = 10;
                      i = i + 1; // pre-increment of the first argument
                      first_arg = i;
                      second_arg = i;
                      i = i + 1; // post-increment of the second argument
                      result = first_arg + second_arg; // 11 + 11

                      Now consider the same on the assumption the compiler evaluates the second operand first:

                      i = 10;
                      second_arg = i;
                      i = i + 1; // post-increment of second argument
                      i = i + 1; // pre-increment of first argument
                      first_arg = 1;
                      result = first_arg + second_arg; // 12 + 10

                      In this case, the results are the same, but that is just by coincidence - if you had used subtraction in stead of addition you'd be in for a surprise! You may want to check http://en.cppreference.com/w/cpp/language/eval_order[^] for further information regarding both function argument evaluation and increment/decrement.

                      GOTOs are a bit like wire coat hangers: they tend to breed in the darkness, such that where there once were few, eventually there are many, and the program's architecture collapses beneath them. (Fran Poretto)

                      L Offline
                      L Offline
                      Lost User
                      wrote on last edited by
                      #23

                      That was exactly my point.

                      Veni, vidi, abiit domum

                      1 Reply Last reply
                      0
                      • OriginalGriffO OriginalGriff

                        If you know that something is compiler dependant, then you can't say "it is like this" - because there is a very good chance that the other person is not using the same compiler! :laugh:

                        Never underestimate the power of stupid things in large numbers --- Serious Sam

                        S Offline
                        S Offline
                        Suk nta
                        wrote on last edited by
                        #24

                        Thanks

                        1 Reply Last reply
                        0
                        Reply
                        • Reply as topic
                        Log in to reply
                        • Oldest to Newest
                        • Newest to Oldest
                        • Most Votes


                        • Login

                        • Don't have an account? Register

                        • Login or register to search.
                        • First post
                          Last post
                        0
                        • Categories
                        • Recent
                        • Tags
                        • Popular
                        • World
                        • Users
                        • Groups