10

我刚刚遇到了这行代码:

if( lineDirection.length2() ){...}

哪里length2返回一个double。0.0 等于 0 NULL, 和/或让我有点困惑false

这是 C++ 标准的一部分还是未定义的行为?

4

5 回答 5

10

这是一个非常标准的行为(布尔转换)

$4.12/1 - “算术、枚举、指针或指向成员类型的指针的右值可以转换为 bool 类型的右值。零值、空指针值或空成员指针值转换为 false;任何其他值转换为真。”

于 2010-09-22T07:44:03.080 回答
6

是 - 比较是针对零 (0.0),如果结果正好为零,则返回 false,否则返回 true。

该行为继承自 C,它以相同的方式处理等效比较。

于 2010-09-22T07:34:24.200 回答
6

值得注意的是,这段代码对于浮点表示非常脆弱。当且仅当浮点值恰好为 0 时,此代码才有效,这在大多数情况下实际上不太可能。在这种特殊情况下可能不是,但如果是这样,肯定应该记录/评论。

在几乎所有其他情况下,您需要确定一个“epsilon 值” ,该值定义了您认为“相同”的浮点数范围 - 否则您的比较很可能会让您在角落里感到惊讶(而且通常不是那么角落)案例。

于 2010-09-22T07:41:18.170 回答
0

当您在没有运算符的情况下进行比较时,您是在“与真”进行比较,因此每个变量类型都被检查为布尔值(简单情况)或其他类型。数值变量类型的 false 值定义为“0”、“0.0”左右,因此当您将它们“与 true”进行比较时,您的比较将返回 false。

于 2010-09-22T07:35:33.527 回答
0

如果 length2 返回 0.0,它将被视为 false。但是通过这种比较,您可能会得到令人惊讶的结果。在浮点比较期间,最好使用 MadKeithV 建议的 epsilon 值。

于 2010-09-22T07:47:43.600 回答