递归函数内添加语句后后续代码不可达的原因咨询
问题根源:C++的代码块范围陷阱
你遇到的问题和递归本身无关,是C++中if语句的代码块范围规则导致的——C++里缩进不代表代码块,if语句默认只管辖紧跟它的第一行语句,后续代码除非用花括号{}包裹,否则不属于这个if分支。
对比两段代码的逻辑差异
第一段(正常执行的代码)
这段代码里,if(rec(x-1))的分支是return 1;,逻辑清晰:
- 当
rec(x-1)返回true时,执行return 1;,跳过后续代码 - 当
rec(x-1)返回false时,跳过return 1;,执行后面的std::cout << x << std::endl;和return 0;
等价的补全花括号版本(逻辑完全一致):
bool rec(int x) { if (x == 0){ return 0; } if(rec(x -1)) { return 1; } std::cout << x << std::endl; return 0; }
第二段(出现不可达代码的问题代码)
你在if分支里加了std::cout语句,但没加花括号,此时if(rec(x-1))只管辖std::cout << "Blocking" << std::endl;这一行,而return 1;变成了无条件执行的语句——不管if条件是否成立,执行完if分支(或跳过它)之后,都会立刻执行return 1;,导致后面的std::cout << x << std::endl;和return 0;永远无法被执行,自然被标记为不可达代码。
等价的错误逻辑版本(补全花括号后一目了然):
bool rec(int x) { if (x == 0){ return 0; } if(rec(x -1)) { std::cout << "Blocking" << std::endl; } // 无论if条件是否满足,都会执行这行return return 1; // 以下代码永远走不到 std::cout << x << std::endl; return 0; }
修正方案
给if分支加上花括号{},把需要属于这个分支的语句都包裹进去,这样return 1;就只会在rec(x-1)返回true时执行:
#include <iostream> bool rec(int x); int main() { rec(2); return 0; } bool rec(int x) { if (x == 0){ return 0; } if(rec(x -1)) { std::cout << "Blocking" << std::endl; return 1; } std::cout << x << std::endl; return 0; }
内容的提问来源于stack exchange,提问作者CJW
相关产品推荐
相关产品推荐

