C语言递归代码执行流程解析 及VS中查看运行过程方法咨询
递归代码运行逻辑详解
该printnumber函数的作用是接收一个整数,逐位输出对应的数字字符,核心的递归终止触发规则为:当传入的参数number是0~9的个位数时,number / 10的结果为0,if (number/10)条件判断为假,不再触发新的递归调用,开始逐层返回执行剩余代码。
我们以输入-123为例,逐步骤拆解运行过程:
- main函数读取用户输入
-123,调用printnumber(-123) - 进入第一层
printnumber(-123)- 判定
number < 0为真,输出负号-,将number赋值为123 - 判定
123 / 10 = 12非0,条件成立,调用printnumber(12)
- 判定
- 进入第二层
printnumber(12)- 判定
12 < 0为假,跳过负号处理逻辑 - 判定
12 / 10 = 1非0,条件成立,调用printnumber(1)
- 判定
- 进入第三层
printnumber(1)- 判定
1 < 0为假,跳过负号处理逻辑 - 判定
1 / 10 = 0,条件不成立,不触发新的递归 - 执行
putchar(1 % 10 + '0'),输出字符1 - 第三层函数执行完成,返回第二层调用位置
- 判定
- 回到第二层
printnumber(12)的递归调用后位置- 执行
putchar(12 % 10 + '0'),输出字符2 - 第二层函数执行完成,返回第一层调用位置
- 执行
- 回到第一层
printnumber(-123)的递归调用后位置- 执行
putchar(123 % 10 + '0'),输出字符3 - 第一层函数执行完成,返回main函数,程序结束
最终输出结果为-123,符合预期。如果输入为个位数(比如0),则不会触发递归,直接输出对应字符即可。
- 执行
VS中查看运行流程的调试设置方法
- 打开项目后,点击代码行号左侧的空白位置添加断点,推荐在
printnumber函数入口行、printnumber(number / 10);递归调用行、putchar(number%10+'0');输出行分别添加断点,添加成功后会显示红色圆点标记 - 按下F5启动调试模式,按提示输入测试整数后回车,程序会在第一个断点位置暂停
- 按下F11(逐语句执行)即可单步运行代码,遇到函数调用时会自动进入函数内部,你可以在VS的「调用堆栈」窗口查看当前所有未完成的函数调用层级,在「局部变量」窗口实时查看当前
number的数值变化 - 若需要直接跳转到下一个断点位置,按下F5即可,无需逐行执行
内容的提问来源于stack exchange,提问作者Kenneth Pranoto
相关产品推荐
相关产品推荐

