我刚刚遇到了这行代码:
if( lineDirection.length2() ){...}
哪里length2
返回一个double
。0.0 等于 0 NULL
, 和/或让我有点困惑false
。
这是 C++ 标准的一部分还是未定义的行为?
我刚刚遇到了这行代码:
if( lineDirection.length2() ){...}
哪里length2
返回一个double
。0.0 等于 0 NULL
, 和/或让我有点困惑false
。
这是 C++ 标准的一部分还是未定义的行为?
这是一个非常标准的行为(布尔转换)
$4.12/1 - “算术、枚举、指针或指向成员类型的指针的右值可以转换为 bool 类型的右值。零值、空指针值或空成员指针值转换为 false;任何其他值转换为真。”
是 - 比较是针对零 (0.0),如果结果正好为零,则返回 false,否则返回 true。
该行为继承自 C,它以相同的方式处理等效比较。
值得注意的是,这段代码对于浮点表示非常脆弱。当且仅当浮点值恰好为 0 时,此代码才有效,这在大多数情况下实际上不太可能。在这种特殊情况下可能不是,但如果是这样,肯定应该记录/评论。
在几乎所有其他情况下,您需要确定一个“epsilon 值” ,该值定义了您认为“相同”的浮点数范围 - 否则您的比较很可能会让您在角落里感到惊讶(而且通常不是那么角落)案例。
当您在没有运算符的情况下进行比较时,您是在“与真”进行比较,因此每个变量类型都被检查为布尔值(简单情况)或其他类型。数值变量类型的 false 值定义为“0”、“0.0”左右,因此当您将它们“与 true”进行比较时,您的比较将返回 false。
如果 length2 返回 0.0,它将被视为 false。但是通过这种比较,您可能会得到令人惊讶的结果。在浮点比较期间,最好使用 MadKeithV 建议的 epsilon 值。