我想知道条件发生时没有任何异常时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
。
我试图在网络上找出答案,但没有找到具体答案,所以我要请专家们。
非常感谢您的帮助。
答案 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" )
,如果那是错误的,那么您将脱离所有条件并到达函数的结尾。不从应该返回某些内容的函数中返回是不确定的行为,因此会出现错误。可能是您的数据集无法达到此目标,但是编译器不知道这一点,因此它会警告您。