我只是遇到了这条代码:

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

在哪里 length2 返回a double. 。令我感到困惑的是,0.0等于0 NULL, ,和/或 false.

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

有帮助吗?

解决方案

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

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

其他提示

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

在几乎所有其他情况下,您都需要决定 “ Epsilon值” 这定义了您认为“相同”的浮点数的范围 - 否则,您的比较很可能会使您在角落(通常不是那么角落)的情况下感到惊讶。

是的 - 比较为零(0.0),如果结果完全为零,则返回false,否则为否。

该行为是从C继承的,C以相同的方式对待等效比较。

当您没有操作员进行比较时,您将比较“反对true”,以便将每个变量类型都被检查为布尔值(简单情况)或其他。数字变量类型的错误值定义为“ 0”,“ 0.0”左右,因此当您将它们与“ True”进行比较时,您的比较将返回false。

如果Length 2返回0.0,则将其视为false。但是,通过此比较,您可能会获得令人惊讶的结果。如Madkeithv在浮点比较期间建议使用的Epsilon值。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top