我只是碰到了这行代码:Is if(double)valid C++?
if(lineDirection.length2()){...}
其中length2
返回double
。这有点令我困惑,0.0相当于0,NULL
,和/或false
。
这是C++标准的一部分还是未定义的行为?
我只是碰到了这行代码:Is if(double)valid C++?
if(lineDirection.length2()){...}
其中length2
返回double
。这有点令我困惑,0.0相当于0,NULL
,和/或false
。
这是C++标准的一部分还是未定义的行为?
这是一个非常标准行为(布尔转换)
$ 4.12/1 - “算术, 枚举,指针,或指针的右值到 成员类型可以转换为一个 右值的键入bool。零值, 空指针值或空成员 指针值转换为false; 任何其他值转换为true。
是 - 比较结果是零(0.0),如果结果恰好为零则返回false,否则返回true。
该行为是从C继承的,C以同样的方式处理等效比较。
当您比较没有运算符时,您正在比较“与真实”,以便每个变量类型被检查为布尔(简单情况)或其他。数字变量类型的虚假值被定义为“0”,“0.0”左右,所以当你比较它们“与真实”时,你的比较将返回false。
值得注意的是,这段代码对于浮点表示来说非常脆弱。当且仅当浮点值恰好为0时,此代码才能工作,在大多数情况下,这实际上不太可能。它可能不是在这种特殊情况下,但如果是这样的话,它肯定会被记录/评论。
在几乎所有其他情况下,您需要决定一个"epsilon value",它定义了您认为“相同”的浮点数的范围 - 否则您的比较很可能会让您在转角处(并且通常不是这样的转角)情况。
+1指出代码的脆弱性。这可能会在很多情况下突破,这可能并不明显:double d = 0.0/-1.0;如果(d)'产生错误,则为'-0.0!= 0.0',并且对于可能产生足够接近'0'值而非完全**'0.0'的许多其他操作也是如此。 – 2010-09-22 07:48:28
确定。可能代码“double x = 0.0; if(x){cout <<”x不是null“;}”print“x不是null”? – 2010-09-22 07:49:47
@DavidRodríguez - dribeas:不,'-0.0 == 0.0',即使位模式不同。这非常重要。表达式'(x == 0.0 ||(1.0/x))'将不会评估'1.0/x',这将导致除以零。 – MSalters 2010-09-22 07:56:25
如果length2返回0.0,它将被视为false。但是通过这种比较你可能会得到令人惊讶的结果。像MadKeithV在浮点比较中所建议的那样更好地使用epsilon值。
还要注意NaN – 2010-09-22 08:55:39