为何函数中调用其他函数后,后续代码仍会执行?原因及规避方法
问题解答
执行两次的原因
你手动模拟的流程遗漏了递归调用返回后外层函数的剩余执行逻辑,完整执行流程如下:
- 第一层
foo()被调用,此时flag为false,!flag判断为真,进入bar()函数 bar()中将flag赋值为true,调用第二层foo()- 第二层
foo()中!flag判断为假,跳过bar()调用,执行cout输出第一次Reached Here!,return后回到bar()函数 bar()执行完毕,回到第一层foo()的if语句结束位置- 第一层
foo()继续执行后续未完成的代码,再次执行cout输出第二次Reached Here!,return后程序结束
规避方法(除将后续代码包裹在else块中外)
- 方法1:在
if分支调用bar()后直接return,终止当前层函数的后续执行
示例代码:
int foo() { if(!flag) { bar(); return 0; } cout<<"Reached Here!"<<endl; return 0; }
- 方法2:在输出代码前增加状态判断,仅符合终止条件时执行输出
示例代码:
int foo() { if(!flag) bar(); // 仅递归终止时执行输出 if(flag) { cout<<"Reached Here!"<<endl; } return 0; }
- 方法3:重构代码逻辑,改用迭代实现替代当前递归结构,从根源上避免递归栈返回带来的重复执行问题。
内容的提问来源于stack exchange,提问作者Carl Eric Doromal
相关产品推荐
相关产品推荐

