函数内的理论规范多返回语句

时间:2019-07-09 14:57:27

标签: c++ function return

我想知道条件发生时没有任何异常时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的情况下有效地返回了函数末尾的return

我试图在网络上找出答案,但没有找到具体答案,所以我要请专家们。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您的假设是正确的。

// FINAL RETURN:
return false;

仅在未达到其他return的情况下才会运行。您收到警告的原因是

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

为假,则进入else部分,如果

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

是假的,那么你去

else if ( gene_inh_mode == "rec" )

,如果那是错误的,那么您将脱离所有条件并到达函数的结尾。不从应该返回某些内容的函数中返回是不确定的行为,因此会出现错误。可能是您的数据集无法达到此目标,但是编译器不知道这一点,因此它会警告您。