Click here to Skip to main content
15,901,122 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.3K   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 
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 
Interesting. I haven't thought of that. This goes along the same lines as STL algorithms that require only a 'less' function or operator<() to work on ordered sets instead of the whole set of comparison operators.

Yet, current compilers will not automagically create a postfix operator out of a prefix operator if none is defined. In part because a postfix operator might have been omitted by design, and in part because it might require more than a simple copy operation - not to mention that some types might explicitely disallow copying by making copy constructors and copy-assignment operators private.

Consider the example I mentioned above - iterators for the purpose of navigating table records - a copy might imply a lot more than copying an index, a pointer, or some data structure that works in that way - in case of databases you might need to a acquire a read lock and be granted the permission to hold onto multiple iterators. I am no database specialist, but I have seen so many weird and unusual constructs for all kinds of reasons I am no longer willing to make *any* assumptions about the inner workings of just about any database function. Nor should a compiler!

P.S.:
Nobody stops you from implementing quite different semantics into your prefix and postfix operators. For instance I once considered creating an iterator for a two-dimensional list of structures and wondered whether I should be using postfix and prefix operators to navigate horizontally and vertically, respectively. In the end I decided against it, but other people might have less scruples Wink | ;)
modified on Thursday, March 4, 2010 5:29 AM

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.