What happens when you logical not a float?

后端 未结 3 2087
死守一世寂寞
死守一世寂寞 2020-12-10 10:35

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?         


        
相关标签:
3条回答
  • 2020-12-10 10:59

    From here

    A float will be converted to false if its exactly 0.0f,
    It will be also true if its not exacly 0.0f!
    Inifinity will also be converted to true.

    0 讨论(0)
  • 2020-12-10 11:06

    Regarding C++, quoting C++11 §5.3.1/9:

    The operand of the logical negation operator ! is contextually converted to bool; its value is true if the converted operand is false and false otherwise. The type of the result is bool.

    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 to false; any other value is converted to true. A prvalue of type std::nullptr_t can be converted to a prvalue of type bool; the resulting value is false.

    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 ! is 0 if the value of its operand compares unequal to 0, 1 if the value of its operand compares equal to 0. The result has type int. The expression !E is equivalent to (0==E).

    I.e. the net result is the same as with C++, excepting the type.

    0 讨论(0)
  • 2020-12-10 11:16

    See for yourself:

    #include <iostream>
    
    int main()
    {
       float a = 2.5;
    
       if ( !a )
           std::cout << !a << "\n";
    
       else
           std::cout << !a << "\n";
    }
    
    0 讨论(0)
提交回复
热议问题