Perhaps it doesn’t matter to the compiler once it optimizes, but in C/C++, I see most people make a for loop in the form of:
for (i = 0; i < arr.length; i++)
where the incrementing is done with the post fix ++. I get the difference between the two forms. i++ returns the current value of i, but then adds 1 to i on the quiet. ++i first adds 1 to i, and returns the new value (being 1 more than i was).
I would think that i++ takes a little more work, since a previous value needs to be stored in addition to a next value: Push *(&i) to stack (or load to register); increment *(&i). Versus ++i: Increment *(&i); then use *(&i) as needed.
(I get that the “Increment *(&i)” operation may involve a register load, depending on CPU design. In which case, i++ would need either another register or a stack push.)
Anyway, at what point, and why, did i++ become more fashionable?
I’m inclined to believe azheglov: It’s a pedagogic thing, and since most of us do C/C++ on a Window or *nix system where the compilers are of high quality, nobody gets hurt.
If you’re using a low quality compiler or an interpreted environment, you may need to be sensitive to this. Certainly, if you’re doing advanced C++ or device driver or embedded work, hopefully you’re well seasoned enough for this to be not a big deal at all. (Do dogs have Buddah-nature? Who really needs to know?)
My theory (why i++ is more fashionable) is that when people learn C (or C++) they eventually learn to code iterations like this:
Note that the post-fix form is important here (using the infix form would create a one-off type of bug).
When the time comes to write a
forloop where++iori++doesn’t really matter, it may feel more natural to use the postfix form.ADDED: What I wrote above applies to primitive types, really. When coding something with primitive types, you tend to do things quickly and do what comes naturally. That’s the important caveat that I need to attach to my theory.
If
++is an overloaded operator on a C++ class (the possibility Rich K. suggested in the comments) then of course you need to code loops involving such classes with extreme care as opposed to doing simple things that come naturally.