if(double)是否有效的C ++?

时间:2010-09-22 07:31:59

标签: c++ floating-point implicit-conversion

我刚刚遇到这行代码:

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

其中length2返回double。让我感到困惑的是0.0相当于0,NULL和/或false

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

5 个答案:

答案 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建议。