# Checking logical expression against true

suggest change

The original C standard had no intrinsic Boolean type, so `bool`, `true` and `false` had no inherent meaning and were often defined by programmers. Typically `true` would be defined as 1 and `false` would be defined as 0.

C99 adds the built-in type `_Bool` and the header `<stdbool.h>` which defines `bool` (expanding to `_Bool`), `false` and `true`. It also allows you to redefine `bool`, `true` and `false`, but notes that this is an obsolescent feature.

More importantly, logical expressions treat anything that evaluates to zero as false and any non-zero evaluation as true. For example:

``````/* Return 'true' if the most significant bit is set */
bool isUpperBitSet(uint8_t bitField)
{
if ((bitField & 0x80) == true)  /* Comparison only succeeds if true is 0x80 and bitField has that bit set */
{
return true;
}
else
{
return false;
}
}``````

In the above example, the function is trying to check if the upper bit is set and return `true` if it is. However, by explicitly checking against `true`, the `if` statement will only succeed if `(bitfield & 0x80)` evaluates to whatever `true` is defined as, which is typically `1` and very seldom `0x80`. Either explicitly check against the case you expect:

``````/* Return 'true' if the most significant bit is set */
bool isUpperBitSet(uint8_t bitField)
{
if ((bitField & 0x80) == 0x80) /* Explicitly test for the case we expect */
{
return true;
}
else
{
return false;
}
}``````

Or evaluate any non-zero value as true.

``````/* Return 'true' if the most significant bit is set */
bool isUpperBitSet(uint8_t bitField)
{
/* If upper bit is set, result is 0x80 which the if will evaluate as true */
if (bitField & 0x80)
{
return true;
}
else
{
return false;
}
}``````