Raymii.org
Quis custodiet ipsos custodes?Home | About | All pages | Cluster Status | RSS Feed
Only zero is false, everything else is true in C++
Published: 12-07-2019 | Author: Remy van Elst | Text only version of this article
❗ This post is over five years old. It may no longer be up to date. Opinions may have changed.
Table of Contents
Some of the code I work on does the following, mostly because it's older C style code now used in a C++ context:
- Have a value that can be changed by a user.
- If that value is not set, it is set to
-1
- That variable, when set to a number, is what a function will use
Zero in this context means that it can be changed but is set to 0. -1
sometimes
means it can not be edited, but sometimes means it's off. Most of the cases I find
where this is used do it this way to save memory.
(This gives a host of other problems, like, how to preserve the value when (turning it off and later just turning it back on?)
Sometimes this variable is checked for true-ness by using a boolean conversion, like this:
if (variable) {
do_stuff();
}
Only if the variable is zero, this check will not execute. If it's set to -1
,
the boolean conversion will convert to true
, which might not be what you meant.
What you want to check for is:
if (variable > 0) {
do_stuff();
}
But better would be to have a seperate variable for the on/off
and a seperate
variable for the actual value to use.
This is oversimplified and for seasoned programmers this will be nothing new, however I found it interesting.
Recently I removed all Google Ads from this site due to their invasive tracking, as well as Google Analytics. Please, if you found this content useful, consider a small donation using any of the options below. It means the world to me if you show your appreciation and you'll help pay the server costs:
GitHub Sponsorship
PCBWay referral link (You get $5, I get $20 after you've placed an order)
Digital Ocea referral link ($200 credit for 60 days. Spend $25 after your credit expires and I'll get $25!)
Implicit conversion rules to booleans
The rules for implicit conversion, which is what's happening when you use something else as a boolean, are described here.
Quoting:
A prvalue of integral, floating-point, unscoped enumeration, pointer, and pointer-to-member types can be converted to a prvalue of type bool. The value zero (for integral, floating-point, and unscoped enumeration) and the null pointer and the null pointer-to-member values become false. All other values become true.
Here is my example code:
#include <iostream>
int main () {
bool boolMinOne;
bool boolPlusOne;
bool boolZero;
bool boolnullptr;
bool boolPtr;
int intPlusOne { 1 };
int intMinOne { -1 };
int intZero { 0 };
int* intPtr { &intPlusOne };
int* nullPtr { nullptr };
boolMinOne = intMinOne;
boolPlusOne = intPlusOne;
boolZero = intZero;
boolPtr = intPtr;
boolnullptr = nullPtr;
std::cout << "boolMinOne: " << boolMinOne << "\n";
std::cout << "boolPlusOne: " << boolPlusOne << "\n";
std::cout << "boolZero: " << boolZero << "\n";
std::cout << "boolNullptr: " << boolnullptr << "\n";
std::cout << "boolPtr: " << boolPtr << "\n";
return 0;
}
Result:
boolMinOne: 1
boolPlusOne: 1
boolZero: 0
boolNullptr: 0
boolPtr: 1
Tags: c
, c++
, conversion
, cpp
, development
, snippets