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)
我很好奇如何以真/假的方式解释声明.
编辑:它在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. */
}
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表现得非常好,否则这段代码几乎肯定会执行语句的主体.
希望这可以帮助!
在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)