嵌套 if 中没有 return 求值
No return evaluation in nested if
仔细观察下面的代码后,我不明白为什么编译器会用 "warning: control reaches end of non-void function".
警告我
bool Foam::solidMagnetostaticModel::read()
{
if (regIOobject::read())
{
if (permeabilityModelPtr_->read(subDict("permeability")) && magnetizationModelPtr_->read(subDict("magnetization")))
{
return true;
}
}
else
{
return false;
}
}
我看不出问题出在哪里,else 语句应该注意在第一个 if 不正确的每种情况下返回 false。
嵌套的 if 是问题所在。
不走那条路,就没有其他路可走了
当 regIOobject::read()
为真,但 permeabilityModelPtr_->read(subDict("permeability"))
或 magnetizationModelPtr_->read(subDict("magnetization"))
为假时跟踪代码路径。在这种情况下,您进入了顶部的 if
块(不包括进入其附加的 else
块的可能性),但无法进入嵌套的 if
块:
bool Foam::solidMagnetostaticModel::read()
{
if (regIOobject::read())
{
// Cool, read() was true, now check next if...
if (permeabilityModelPtr_->read(subDict("permeability")) && magnetizationModelPtr_->read(subDict("magnetization")))
{
return true;
}
// Oh no, it was false, now we're here...
}
else
{
// First if was true, so we don't go here...
return false;
}
// End of function reached, where is the return???
}
最简单的修复方法是只删除 else { }
包装,因此任何 fallthrough 最终都在 return false;
:
bool Foam::solidMagnetostaticModel::read()
{
if (regIOobject::read())
{
// Cool, read() was true, now check next if...
if (permeabilityModelPtr_->read(subDict("permeability")) && magnetizationModelPtr_->read(subDict("magnetization")))
{
return true;
}
// Oh no, it was false, now we're here...
}
// Oh, but we hit return false; so we're fine
return false;
}
或者,完全避免特别提及 true
或 false
,因为您的函数在逻辑上只是 and
将三个条件结合在一起的结果:
bool Foam::solidMagnetostaticModel::read()
{
// No need to use ifs or explicit references to true/false at all
return regIOobject::read() &&
permeabilityModelPtr_->read(subDict("permeability")) &&
magnetizationModelPtr_->read(subDict("magnetization"));
}
the else statement should care for returning false in every case which the first if is not true.
正确,但是如果第一个 if
条件为真,而第二个 if
条件不成立怎么办?
即:如果 regIOobject::read()
returns true
,但是 permeabilityModelPtr_->read(subDict("permeability"))
returns false
?
然后控制流进入第一个if
块,没有进入return,但没有进入else
块(因为第一个条件为真),所以它刚从函数末尾掉下来,没有碰到 return
语句。
如果您希望 else { return false; }
部分适用于任一条件,您可以天真地 copy/paste it:
if (COND1) {
if (COND2) {
return true;
} else {
return false;
}
} else {
return false;
}
但这是相当多的代码重复。更好的解决方案是将嵌套的 if
替换为单个条件:
if (COND1 && COND2) {
return true;
} else {
return false;
}
仍有一些重复:两个分支都包含一个 return
语句,后跟一些表达式。
我们可以分解出公共部分(return
)并将条件推入表达式:
return COND1 && COND2 ? true : false;
但是? true : false
是多余的:如果条件为真,求值为真,否则求值为假?嗯,这就是条件本身的作用:
return COND1 && COND2;
或者用你的具体表达:
return regIOobject::read()
&& permeabilityModelPtr_->read(subDict("permeability"))
&& magnetizationModelPtr_->read(subDict("magnetization"));
仔细观察下面的代码后,我不明白为什么编译器会用 "warning: control reaches end of non-void function".
警告我bool Foam::solidMagnetostaticModel::read()
{
if (regIOobject::read())
{
if (permeabilityModelPtr_->read(subDict("permeability")) && magnetizationModelPtr_->read(subDict("magnetization")))
{
return true;
}
}
else
{
return false;
}
}
我看不出问题出在哪里,else 语句应该注意在第一个 if 不正确的每种情况下返回 false。
嵌套的 if 是问题所在。
不走那条路,就没有其他路可走了
当 regIOobject::read()
为真,但 permeabilityModelPtr_->read(subDict("permeability"))
或 magnetizationModelPtr_->read(subDict("magnetization"))
为假时跟踪代码路径。在这种情况下,您进入了顶部的 if
块(不包括进入其附加的 else
块的可能性),但无法进入嵌套的 if
块:
bool Foam::solidMagnetostaticModel::read()
{
if (regIOobject::read())
{
// Cool, read() was true, now check next if...
if (permeabilityModelPtr_->read(subDict("permeability")) && magnetizationModelPtr_->read(subDict("magnetization")))
{
return true;
}
// Oh no, it was false, now we're here...
}
else
{
// First if was true, so we don't go here...
return false;
}
// End of function reached, where is the return???
}
最简单的修复方法是只删除 else { }
包装,因此任何 fallthrough 最终都在 return false;
:
bool Foam::solidMagnetostaticModel::read()
{
if (regIOobject::read())
{
// Cool, read() was true, now check next if...
if (permeabilityModelPtr_->read(subDict("permeability")) && magnetizationModelPtr_->read(subDict("magnetization")))
{
return true;
}
// Oh no, it was false, now we're here...
}
// Oh, but we hit return false; so we're fine
return false;
}
或者,完全避免特别提及 true
或 false
,因为您的函数在逻辑上只是 and
将三个条件结合在一起的结果:
bool Foam::solidMagnetostaticModel::read()
{
// No need to use ifs or explicit references to true/false at all
return regIOobject::read() &&
permeabilityModelPtr_->read(subDict("permeability")) &&
magnetizationModelPtr_->read(subDict("magnetization"));
}
the else statement should care for returning false in every case which the first if is not true.
正确,但是如果第一个 if
条件为真,而第二个 if
条件不成立怎么办?
即:如果 regIOobject::read()
returns true
,但是 permeabilityModelPtr_->read(subDict("permeability"))
returns false
?
然后控制流进入第一个if
块,没有进入return,但没有进入else
块(因为第一个条件为真),所以它刚从函数末尾掉下来,没有碰到 return
语句。
如果您希望 else { return false; }
部分适用于任一条件,您可以天真地 copy/paste it:
if (COND1) {
if (COND2) {
return true;
} else {
return false;
}
} else {
return false;
}
但这是相当多的代码重复。更好的解决方案是将嵌套的 if
替换为单个条件:
if (COND1 && COND2) {
return true;
} else {
return false;
}
仍有一些重复:两个分支都包含一个 return
语句,后跟一些表达式。
我们可以分解出公共部分(return
)并将条件推入表达式:
return COND1 && COND2 ? true : false;
但是? true : false
是多余的:如果条件为真,求值为真,否则求值为假?嗯,这就是条件本身的作用:
return COND1 && COND2;
或者用你的具体表达:
return regIOobject::read()
&& permeabilityModelPtr_->read(subDict("permeability"))
&& magnetizationModelPtr_->read(subDict("magnetization"));