如果嵌套,则没有返回评估

时间:2018-10-17 01:38:02

标签: c++ if-statement boolean-expression

仔细查看以下代码后,我看不到编译器为什么通过“警告:控制到达非void函数的末尾”来警告我。

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

我看不出问题出在哪里,在每种情况下,如果第一个if不为true,则else语句应注意返回false。

3 个答案:

答案 0 :(得分:2)

regIOobject::read()为true,但是permeabilityModelPtr_->read(subDict("permeability"))magnetizationModelPtr_->read(subDict("magnetization"))为false时,跟踪代码路径。在这种情况下,您输入顶部的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"));
}

答案 1 :(得分:1)

嵌套的if是问题。

不采用该分支时,没有其他可采用的路径

答案 2 :(得分:1)

  

else语句应在每种情况下(如果第一个if不为真)返回false。

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

也就是说:如果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是多余的:如果条件为true,则求值为true,否则为false?好吧,这就是条件本身所做的:

return COND1 && COND2;

或使用您的具体表达方式:

return regIOobject::read()
    && permeabilityModelPtr_->read(subDict("permeability"))
    && magnetizationModelPtr_->read(subDict("magnetization"));