嵌套 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;
}

或者,完全避免特别提及 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"));
}

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