繁体   English   中英

加倍为真/假

[英]double as true / false

Bjarne建议使用if的条件作为范围限制。 特别是这个例子。

if ( double d = fd()  ) {
   // d in scope here...
}

我很想知道如何在对/错的意义上解释声明。

  1. 这是一个宣言
  2. 这是双重的。

编辑:建议使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM