是!NaN不是NaN?

Ken*_*Y-N 6 c++ floating-point nan language-lawyer

我遇到了这个代码,它发出警告gcc:

float f;
// Calculate a value for f
if (!f == 0.0)
{
    // Handle it being non-zero
}
Run Code Online (Sandbox Code Playgroud)

这可能只是另一个团队成员的错字,并检查代码的真正含义是:

if (f != 0.0)
// OR
if (!(f == 0.0))
Run Code Online (Sandbox Code Playgroud)

我已经纠正了代码,但我只是想知道会!NaN评估什么.我们使用f里面的值if,所以我们不希望NaN超过支票.

Ala*_*les 3

请参阅https://en.cppreference.com/w/cpp/language/implicit_conversion

整型、浮点型、无作用域枚举、指针和成员指针类型的纯右值可以转换为 bool 类型的纯右值。

零值(对于整型、浮点型和无作用域枚举)以及空指针和指向成员的空指针值将变为 false。所有其他值都变为 true

因此!f == 0.0相当于!(f != 0.0) == 0.0或(f == 0.0) == false或f != 0.0