C++函数return语句执行逻辑及末尾return触发条件问询
关于C++ return语句执行逻辑及你的代码分析
首先给你明确的结论:
- 在C++中,一旦
return语句被执行,会立即终止当前函数的执行流程,直接将返回值传递给调用者,函数内return之后的代码都不会被执行,正常业务流程下没有例外情况。 - 你添加的末尾
return false,确实只会在所有前置的return语句都没有被触发的情况下才会执行。
接下来具体分析你的代码逻辑:
原代码的警告根源
你的原代码因为存在多条无返回值的代码路径,触发了-Wreturn-type编译警告。我们先把压缩的原代码格式化后更清晰地看问题:
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; } // 此处:若ex不是NA但转int后≠0,且gen是NA,无return } else if ( gnomad_gen_controls_an != "NA" ) { if (std::stoi(gnomad_gen_controls_an) == 0) { return true; } // 此处:若gen不是NA但转int后≠0,无return } 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; } // 此处:若ex不是NA且可转float,但cmpf不成立,且gen是NA,无return } 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; } // 此处:若gen不是NA且可转float,但cmpf不成立,无return } else { return false; } } // 此处:若gene_inh_mode既不是dom/NA也不是rec,无return } // 原代码无末尾return,编译器判定存在无返回值路径 }
可以看到,原代码的警告不止来自gene_inh_mode非dom/rec的情况,还有多个分支场景都没有明确的return语句,编译器无法确保所有路径都有返回值,因此触发警告。
修改后代码的正确性验证
你添加末尾return false之后,所有无返回值的路径都会走到这个语句,完美消除了编译警告。这个末尾return的触发场景只有以下几种:
- 第一个条件(两个参数都是
NA)不成立; - 进入else块后,
gene_inh_mode既不是dom/NA,也不是rec; dom/NA分支中,gnomad_ex_controls_an不是NA但转int后不等于0,且gnomad_gen_controls_an是NA;rec分支中,gnomad_ex_controls_an不是NA且可转float但cmpf比较不成立,且gnomad_gen_controls_an是NA;
而所有其他符合业务逻辑的场景,都会被前置的return true或return false提前终止函数,绝对不会走到末尾的return false。
总结一下:
- C++的
return语句确实是立即执行并终止函数,正常流程下没有例外; - 你添加的末尾return完全符合预期,只会在所有前置return都未触发的边缘场景下执行。
内容的提问来源于stack exchange,提问作者cccnrc
相关产品推荐
相关产品推荐

