Home > Back-end >  Use of logical not operator (twice) on right hand side of expression with pointer variable
Use of logical not operator (twice) on right hand side of expression with pointer variable

Time:07-06

Why would anyone type variable = !!ptr as an expression? Looks like a bug or unintentional defect to me. The result should be just ptr, but one must wonder the original intent. Thoughts?

CodePudding user response:

The ! operator results in a value of 0 if its operand is equal to 0, or 1 otherwise.

If ptr is 0 (or NULL if it's a pointer), then !ptr will evaluate to 1, and !!ptr will evaluate to 0. If ptr is not 0 (or not NULL), then !ptr will evaluate to 0 and !!ptr will evaluate to 1.

So the end result of !!ptr is that the value of ptr is normalized to a boolean value, i.e. 0 will remain 0 and non-zero will be converted to 1.

CodePudding user response:

For all scalar types, !x is equivalent to x == 0 and !!x is equivalent to x != 0. !!x is hence an idiom to normalize x as a boolean.

If the type of variable is bool, variable = !!ptr is indeed equivalent to variable = ptr and will generate the same code.

Which one is more readable is debatable: implicit conversion to bool is somewhat confusing and error prone because variable = ptr would mean something totally different if variable has a different integer type, whereas !!ptr is safe and explicit, once you master the idiom.

  • Related