嵌套 if 中没有返回评估

No return evaluation in nested if

本文关键字:返回 评估 if 嵌套      更新时间:2023-10-16

在仔细观察以下代码后,我不明白为什么编译器会用"警告:控制到达非无效函数的末尾"来警告我。

bool Foam::solidMagnetostaticModel::read()
{
if (regIOobject::read())
{
if (permeabilityModelPtr_->read(subDict("permeability")) && magnetizationModelPtr_->read(subDict("magnetization")))
{
return true;
}
}
else
{
return false;
}
}

我看不出问题出在哪里,else 语句应该关心在每种情况下返回 false,第一个 if 不真实。

regIOobject::read()为 true 但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 { }包装,因此任何故障最终都会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;
}

或者,完全避免特别提及truefalse,因为您的函数在逻辑上只是将三个条件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"));
}

嵌套的if是问题所在。

如果不采用该分支,则没有其他路径可走

else 语句应该注意在第一个 if 不为真的每种情况下返回 false。

正确,但如果第一个if条件为真,但第二个if条件不为真怎么办?

也就是说:如果regIOobject::read()返回true,但permeabilityModelPtr_->read(subDict("permeability"))返回false怎么办?

然后控制流进入第一个if块,不返回,但不进入else块(因为第一个条件为真(,所以它只是从函数的末尾掉下来,没有命中return语句。

如果您希望else { return false; }部分应用于任一条件,您可以天真地复制/粘贴它:

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"));