Click here to Skip to main content
15,884,099 members
Articles / Programming Languages / C++
Tip/Trick

Increment/Decrement operators

Rate me:
Please Sign up or sign in to vote.
4.40/5 (3 votes)
2 Mar 2010CPOL 19.2K   1   9
When incrementing or decrementing a variable, favor prefix operators over postfix operators if you do not need the value of the expression.Example:void foo(std::vector intvec){ for (std::vector::iterator it = intvec.begin(); it != intvec.end(); ++it) { // do something ...
When incrementing or decrementing a variable, favor prefix operators over postfix operators if you do not need the value of the expression.

Example:
void foo(std::vector<int> intvec)
{
   for (std::vector<int>::iterator it = intvec.begin(); it != intvec.end(); ++it)
   {
      // do something
   }
}


The reason for this is that postfix operators (such as it++) need to create a copy of the original variable. This copy is being used as a placeholder that later can be used as the value of the postfix expression. A prefix operator does not need to do that, as the value of a prefix increment or decrement expression is the value of the variable after the operation.

The cost of creating an additional temp might be trivial for integral types, but often ++/-- operators are defined for non-trivial types, and by their very nature they are being used in loop constructs.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer (Senior)
Switzerland Switzerland
Graduated at TU Darmstadt in Math & CS, with a heavy focus on CAD/CAM

Programming and designing applications in C++ in the areas AI, real-time programming, client-server applications and CAD/CAM since 1985.

Personal interests: AI, computer graphics, games, reading

Comments and Discussions

 
GeneralMy vote of 1 Pin
Yoldas Askan15-Sep-14 7:00
Yoldas Askan15-Sep-14 7:00 
QuestionIs there any standard that requires creation of a temp? Pin
supercat92-Mar-10 6:59
supercat92-Mar-10 6:59 
AnswerRe: Is there any standard that requires creation of a temp? Pin
Tim Craig2-Mar-10 8:49
Tim Craig2-Mar-10 8:49 
AnswerRe: Is there any standard that requires creation of a temp? Pin
dwilliss2-Mar-10 15:44
dwilliss2-Mar-10 15:44 
GeneralRe: Is there any standard that requires creation of a temp? Pin
Tim Craig2-Mar-10 21:38
Tim Craig2-Mar-10 21:38 
GeneralRe: Is there any standard that requires creation of a temp? Pin
Stefan_Lang2-Mar-10 22:25
Stefan_Lang2-Mar-10 22:25 
GeneralRe: Is there any standard that requires creation of a temp? Pin
supercat93-Mar-10 7:35
supercat93-Mar-10 7:35 
Since you do not know how these will be used, you absolutely have to create a temp copy in your postfix operators or else lose semantics!

Would I be correct in guessing that there's no built-in mechanism for performing a postfix operation on an object for which only the prefix operator is defined, by assigning a temp, performing the prefix operator, and then using the temp? If the language could itself define postfix operations in terms of prefix, it would seem that would avoid the issue.

Otherwise, I wonder whether it would be practical to supply a library with a header file that defined a postfix operator "inline", invoking the prefix operator to do the actual work? An optimizer should be able to recognize that the temp could be eliminated if it wasn't used.

Incidentally, if the language was responsible for converting the postfix form to prefix, it could also rewrite postfix-increment expressions so as to avoid having a temporary copy of the object; in some cases it would be necessary to hold a temporary reference, but that may be cheaper than holding the object.

For example, the code "a = b++ + c++;" could be rewritten as "a = b+c, ++b, ++c;", moving the post-increment operators to a spot just before the next sequence point. Even if b and c were complex objects, since the C standard does not specify when the increment operations must take place, no temporary variable would be needed unless the execution of something in the expression could cause b and c to refer to different objects.
GeneralRe: Is there any standard that requires creation of a temp? [modified] Pin
Stefan_Lang3-Mar-10 23:22
Stefan_Lang3-Mar-10 23:22 
GeneralRe: Is there any standard that requires creation of a temp? Pin
supercat94-Mar-10 5:00
supercat94-Mar-10 5:00 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.