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