代码之家  ›  专栏  ›  技术社区  ›  Viktor Sehr

是(双)有效C++吗?

  •  8
  • Viktor Sehr  · 技术社区  · 15 年前

    我刚刚遇到了一行代码:

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

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

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

    5 回复  |  直到 14 年前
        1
  •  10
  •   Chubsdad    15 年前

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

    枚举、指针或指向 bool类型的r值。一个零值, 指针值转换为false;

        2
  •  6
  •   Jonathan Leffler    15 年前

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

        3
  •  6
  •   Community Mohan Dere    9 年前

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

    在几乎所有其他情况下,你都需要决定 "epsilon value" 它定义了你认为“相同”的浮点数的范围——否则,你的比较很可能会让你大吃一惊。

        4
  •  0
  •   Tomasz Kowalczyk    15 年前

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

        5
  •  0
  •   Liton    15 年前

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