Possible Duplicate:
Difference between i++ and ++i in a loop?
Can anyone explain what's the difference between those:
for(unsigned col = 0; col < n; ++col, num_to_fill >>= 1U)
{
for(unsigned row = num_to_fill; row < (1U << n); row += (num_to_fill * 2))
{
std::fill_n(&output[col][row], num_to_fill, 1);
}
}
and
for(unsigned col = 0; col < n; col++, num_to_fill >>= 1U)
{
for(unsigned row = num_to_fill; row < (1U << n); row += (num_to_fill * 2))
{
std::fill_n(&output[col][row], num_to_fill, 1);
}
}
When col=0
, In ex.1 Output[col][row]
will be output[1][row]
and In ex.2 Output[col][row]
will be output[0][row]
. Am I right ?
Question 2 : Would using >>= 1U
instead of /= 2
make any difference ?
It does not make any difference to the value of
col
within the loop - assumingcol
is a primitive value. Ifcol
was a class, the prefix and postfix '++' operators might be overloaded to do two different things, although I would consider it bad practice. Consider the following example:Both of these just print out 0 to 9, despite the fact that you pre-increment in one, and post-increment in the other. The incrementation of
i
happens at the end of each run of the loop whether or not you use pre or post increment. I believe pre-incrementing is more efficient, since - and I may be wrong here - the compiler does not then need to use a temporary variable1., but this would only be noticeable if you are looping for a very long time (and of course 'More computing sins are committed in the name of efficiency than for any other single reason'.)As for question 2:
Unlikely. Bit shifting would be faster if the compiler did not optimise, but chances are that your compiler will optimise this into a bit shift.
As a side note, I generally find doing
unsigned variableName
(that is, dropping theint
) bad practice - although C++ will shove in anint
anywhere one is missing, it is less readable to me.1.: Stephen in the comments (a different Stephen ;) ) notes that - "Pre-increment is more efficient for standard library container iterators, but it's no different for primitive types, since copying an integer is cheaper than copying a larger iterator (in particular std::set and std::map iterators)."
There is no difference for
unsigned
. However, there would be a difference for classes with overloadedoperator++
, because it would call its different overloads (usually, the postfix operator creates a copy of the class, which means it may be slower).Probably not. Its semantics are the same for unsigned, and the compilers usually treat them equally and can change one into another if it's faster.