![](/img/trans.png)
[英]when c++ return true / false if the data type is integer or double value
[英]double as true / false
Bjarne建议使用if的条件作为范围限制。 特别是这个例子。
if ( double d = fd() ) {
// d in scope here...
}
我很想知道如何在对/错的意义上解释声明。
编辑:建议使用6.3.2.1 C ++编程语言。
Edit2:templatetypedefs的指针建议,尤其是动态转换时,可能会为Bjarnes的建议提供见识。
SteveJessop告诉我:-条件不是表达式,也可以是声明,使用的值是要求值的值。
您所看到的代码是一种专用技术,用于在if
语句中声明变量。 您通常会看到以下内容:
if (T* ptr = function()) {
/* ptr is non-NULL, do something with it here */
} else {
/* ptr is NULL, and moreover is out of scope and can't be used here. */
}
一个特别常见的情况是在此处使用dynamic_cast
:
if (Derived* dPtr = dynamic_cast<Derived*>(basePtr)) {
/* basePtr really points at a Derived, so use dPtr as a pointer to it. */
} else {
/* basePtr doesn't point at a Derived, but we can't use dPtr here anyway. */
}
您的情况是在if
语句中声明了一个double
。 C ++自动将任何非零值解释为true
并将任何零值解释为false
。 该代码的意思是“声明d
并将其设置为等于fd()
。如果它不为零,则执行if
语句。”
就是说,这是一个非常糟糕的主意,因为double
会受到各种舍入错误的影响,在大多数情况下,防止它们变为0。 除非function
非常完善,否则这段代码几乎可以肯定会执行if
语句的主体。
希望这可以帮助!
在Stroustrup给出的示例中, if
块中的代码将值除以d
:
if (double d = prim(true)) {
left /= d;
break;
}
除以0是未定义的行为,因此在这种情况下 ,在除之前先将d
与值0.0
进行测试是有意义的。 由于Stroustrup指出的原因,将定义置于条件中是一种方便的方法。
您的代码没有给出为什么值0.0
会是特殊的原因,因此不清楚为什么有人会将d
的定义与该测试结合在一起。 仅在需要特别对待要定义的类型的“假”值时,才使用Stroustrup的模式。 否则,只需执行以下操作:
{
double d = fd();
// d in scope here...
}
if
语句基于在赋值表达式中分配给变量的值。 如果double计算除0.0以外的任何值,它将在其中运行代码。
请注意,您不应该将双精度数与零进行比较,但是根据我的经验,它通常是有效的。
基本上,您不应该这样做。
该主题的其他贡献者还发现,此表达式用于排除零的情况,以避免被零除。 这绝对是明智的,就我而言,这种情况使这种用法合法化(但请考虑这样的代码可能引起的混乱)。
它既是一个声明又是一个双重声明。 这相当于
{
double d = fd();
if (d) {
}
}
但是,此模式值得使用一些小的附加语法来简化,因为它相当有用且通用。 另外,一旦开始添加else子句,转换就不太明显了,因为d
在它们的范围之外。
另外,正如其他人指出的那样,它通常很有用,但是与0相比,特定的FP类型存在一些问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.