Нет возврата в случае вложенности, если - PullRequest
0 голосов
/ 17 октября 2018

Внимательно посмотрев следующий код, я не могу понять, почему компилятор предупреждает меня «предупреждением: управление достигает конца не пустой функции».

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

Я не вижу, где находитсяпроблема, оператор else должен заботиться о возврате false в каждом случае, которое первым if не соответствует истине.

Ответы [ 3 ]

0 голосов
/ 17 октября 2018

Трассировка пути кода, когда 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;
}

В качестве альтернативы, вообще избегайте упоминания 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"));
}
0 голосов
/ 17 октября 2018

оператор else должен заботиться о возврате false в каждом случае, которое в первом случае if неверно.

Правильно, но что, если первое 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"));
0 голосов
/ 17 октября 2018

Вложенное if - это проблема.

Когда эта ветвь не берется, других путей нет

...