I assume this just returns an int. Is there anything else going on I should be aware of? C/C++ differences?
float a = 2.5;
!a; // What does this return? Int? Float?
See Question&Answers more detail:osI assume this just returns an int. Is there anything else going on I should be aware of? C/C++ differences?
float a = 2.5;
!a; // What does this return? Int? Float?
See Question&Answers more detail:osRegarding C++, quoting C++11 §5.3.1/9:
The operand of the logical negation operator
!
is contextually converted tobool
; its value istrue
if the converted operand isfalse
andfalse
otherwise. The type of the result isbool
.
So what's really relevant here is the behavior of static_cast<bool>(some_float)
– quoting §4.12/1:
A prvalue of arithmetic, unscoped enumeration, pointer, or pointer to member type can be converted to a prvalue of type
bool
. A zero value, null pointer value, or null member pointer value is converted tofalse
; any other value is converted totrue
. A prvalue of typestd::nullptr_t
can be converted to a prvalue of typebool
; the resulting value isfalse
.
Putting those together, 2.5f
is a non-zero value and will consequently evaluate to true
, which when negated will evaluate to false
. I.e., !a
== false
.
Regarding C, quoting C99 §6.5.3.3/5:
The result of the logical negation operator
!
is0
if the value of its operand compares unequal to0
,1
if the value of its operand compares equal to0
. The result has typeint
. The expression!E
is equivalent to(0==E)
.
I.e. the net result is the same as with C++, excepting the type.