Today while writing some Visual C++ code I have come across something which has surprised me. It seems C++ supports ++ (increment) for bool, but not — (decrement). It this just a random decision, or there is some reason behind this?
This compiles:
static HMODULE hMod = NULL;
static bool once = false;
if (!once++)
hMod = LoadLibrary("xxx");
This does not:
static HMODULE hMod = NULL;
static bool once = true;
if (once--)
hMod = LoadLibrary("xxx");
It comes from the history of using integer values as booleans.
If
xis anint, but I am using it as a boolean as perif(x)...then incrementing will mean that whatever its truth value before the operation, it will have a truth-value oftrueafter it (barring overflow).However, it’s impossible to predict the result of
--given knowledge only of the truth value ofx, as it could result infalse(if the integral value is 1) ortrue(if the integral value is anything else – notably this includes 0 [false] and 2 or more [true]).So as a short-hand
++worked, and--didn’t.++is allowed on bools for compatibility with this, but its use is deprecated in the standard and it was removed in C++17.This assumes that I only use
xas an boolean, meaning that overflow can’t happen until I’ve done++often enough to cause an overflow on it’s own. Even with char as the type used andCHAR_BITSsomething low like 5, that’s 32 times before this doesn’t work any more (that’s still argument enough for it being a bad practice, I’m not defending the practice, just explaining why it works) for a 32-bitintwe of course would have to use++2^32 times before this is an issue. With--though it will only result infalseif I started with a value of 1 fortrue, or started with 0 and used++precisely once before.This is different if we start with a value that is just a few below 0. Indeed, in such a case we might want
++to result in thefalsevalue eventually such as in:However, this example treats
xas aninteverywhere except the conditional, so it’s equivalent to:Which is different to only using
xas a boolean.