спецификация теории множественного возврата внутри функции - PullRequest
0 голосов
/ 09 июля 2019

Мне интересно, является ли оператор return немедленным, когда условие возникает без каких-либо исключений.

В частности, у меня есть функция BOOL:

bool pm2_filter( std::string gnomad_ex_controls_an, std::string gnomad_gen_controls_an, std::string &gene_inh_mode )
{

    if ( gnomad_ex_controls_an == "NA" && gnomad_gen_controls_an == "NA" ) { 
        return true;
    }
    else {
        if ( gene_inh_mode == "dom" || gene_inh_mode == "NA" ) {
            if ( gnomad_ex_controls_an != "NA" ) {
                if (std::stoi(gnomad_ex_controls_an) == 0) {
                    return true;
                }
            }
            else if ( gnomad_gen_controls_an != "NA" ) {
                if (std::stoi(gnomad_gen_controls_an) == 0) {
                  return true;
                }
            }
            else {
                return false;
            }
        }
        else if ( gene_inh_mode == "rec" ) {
            if ( gnomad_ex_controls_an != "NA" && floatable(gnomad_ex_controls_an) ) {
                if (cmpf(std::stof(gnomad_ex_controls_an), 1E-4, 1E-10)) {
                    return true;
                }
            }
            else if ( gnomad_gen_controls_an != "NA" && floatable(gnomad_gen_controls_an) ) {
                if (cmpf(std::stof(gnomad_gen_controls_an), 1E-4, 1E-10)) {
                    return true;
                }
            }
            else {
                return false;
            }
        }
    }
}

Если я пытаюсь запустить его таким образом, он предупреждает меня:

dependencies/filterFunctions.cpp:403:1: warning: control may reach end of non-void function [-Wreturn-type]
}

, чтобы избежать предупреждения, я могу поставить окончательную return для функции, например,

bool pm2_filter( std::string gnomad_ex_controls_an, std::string gnomad_gen_controls_an, std::string &gene_inh_mode )
{

    if ( gnomad_ex_controls_an == "NA" && gnomad_gen_controls_an == "NA" ) { 
        return true;
    }
    else {
        if ( gene_inh_mode == "dom" || gene_inh_mode == "NA" ) {
            if ( gnomad_ex_controls_an != "NA" ) {
                if (std::stoi(gnomad_ex_controls_an) == 0) {
                    return true;
                }
            }
            else if ( gnomad_gen_controls_an != "NA" ) {
                if (std::stoi(gnomad_gen_controls_an) == 0) {
                  return true;
                }
            }
            else {
                return false;
            }
        }
        else if ( gene_inh_mode == "rec" ) {
            if ( gnomad_ex_controls_an != "NA" && floatable(gnomad_ex_controls_an) ) {
                if (cmpf(std::stof(gnomad_ex_controls_an), 1E-4, 1E-10)) {
                    return true;
                }
            }
            else if ( gnomad_gen_controls_an != "NA" && floatable(gnomad_gen_controls_an) ) {
                if (cmpf(std::stof(gnomad_gen_controls_an), 1E-4, 1E-10)) {
                    return true;
                }
            }
            else {
                return false;
            }
        }
    }

    // FINAL RETURN:
    return false;

}

но мне интересно, если этот return в конце функции эффективно возвращается ТОЛЬКО ADN, ЕСЛИ ТОЛЬКО НЕТ другого предыдущего return, без исключения.

Я попытался выяснить это на веб-гайке и не нашел конкретного ответа, поэтому я прошу вас, ребята-эксперты.

Заранее большое спасибо за любую помощь.

1 Ответ

1 голос
/ 09 июля 2019

Ваше предположение верно.

// FINAL RETURN:
return false;

Запустится, только если не достигнут ни один из return. Причина, по которой вы получаете предупреждение:

if ( gnomad_ex_controls_an == "NA" && gnomad_gen_controls_an == "NA" )

ложно, тогда вы входите в остальную часть, и если

if ( gene_inh_mode == "dom" || gene_inh_mode == "NA" )

ложно, тогда вы идете к

else if ( gene_inh_mode == "rec" )

и если это неверно, вы выпадаете из всех условий и достигаете конца функции. Это неопределенное поведение - не возвращаться из функции, которая должна что-то возвращать, поэтому вы получаете ошибку. Возможно, ваш набор данных не может этого достичь, но компилятор не может этого знать, поэтому предупреждает вас.

...