加倍为真/假

Cap*_*ffe 6 c++ if-statement type-conversion scoping variable-declaration

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

if ( double d = fd()  ) {
   // d in scope here...
}
Run Code Online (Sandbox Code Playgroud)

我很好奇如何以真/假的方式解释声明.

  1. 这是一个宣言
  2. 这是双倍的.

编辑:它在6.3.2.1 C++编程语言中作为推荐.

Edit2:templatetypedefs建议指针,特别是动态强制转换,可能会让人深入了解Bjarnes的建议.

SteveJessop告诉我: - 条件不是表达式它也可以是声明,使用的值是被评估的值.

tem*_*def 6

您看到的代码是一种在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. */
}
Run Code Online (Sandbox Code Playgroud)

一个特别常见的情况是在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. */
}
Run Code Online (Sandbox Code Playgroud)

在你的情况下发生的事情是你在声明中声明了一个double内容if.C++自动将任何非零值解释为true和任何零值false.这段代码的含义是"声明d并将其设置为等于fd().如果它非零,则执行该if语句."

也就是说,这是一个非常糟糕的主意,因为doubles会受到各种舍入错误的影响,这些错误会阻止它们在大多数情况下为0.if除非function表现得非常好,否则这段代码几乎肯定会执行语句的主体.

希望这可以帮助!


Ste*_*sop 5

在Stroustrup给出的示例中,if块中的代码将值除以d:

if (double d = prim(true)) {
    left /= d;
    break;
}
Run Code Online (Sandbox Code Playgroud)

除以0是未定义的行为,因此在这种情况下检查分割前d的值是有意义的0.0.由于Stroustrup声明的原因,将定义置于条件中是一种方便的方法.

您的代码没有说明为什么值0.0会特殊,因此不清楚为什么有人会将该定义d与该测试结合起来.只有在您定义的类型的"假"值需要特殊处理时才使用Stroustrup的模式.否则就这样做:

{
    double d = fd();
    // d in scope here...
}
Run Code Online (Sandbox Code Playgroud)