关于自动退栈

qq_27494551 2016-07-12 06:16:51
当我调用 strlen(“Hello”)这字符串的时候 。进入strlen(const char *s)
{
return (*s ? strlen(s+1) +1 :0) ;
}
然后 由于*s != 0 开始递归 直到 *s = 0 终止循环; strlen(s+1)的返回值 等于 0 ;在然后 由于之前strlen("Hello")的调用还没得到返回值 系统就进行退栈,退栈过程中*s != 0,但也不会在调用strlen(s+1)函数 , 之前 strlen(s+1)的值 = 0 ,后面 还有个 +1 ,由于退栈中*s != 0, 就好比 strlen()这个函数返回值一直循环自增 1 ;直到
回到 s 地址首位,在把值返回到 最初调用地方 。我这样理解算不算正确,如果有误指点下 (退栈过程中应该调用该函数对么?)退栈时 地址 就在那个地方 所以不会调用该函数?

我这样理解算不算正确,如果有误指点下 (退栈过程中应该调用该函数对么?)
...全文
129 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ooolinux 2016-07-12
  • 打赏
  • 举报
回复
我现在还不知道 hello 的长度等于多少,我把它交给 1 + mystrlen(ello) 我现在还不知道 ello 的长度等于多少,我把它交给 1 + mystrlen(llo) 我现在还不知道 llo 的长度等于多少,我把它交给 1 + mystrlen(lo) 我现在还不知道 lo 的长度等于多少,我把它交给 1 + mystrlen(o) 我现在还不知道 o 的长度等于多少,我把它交给 1 + mystrlen() 递归到了"\0"串了,返回空串的长度等于0,这个出口很重要,避免了函数的死循环 现在我知道 o 的长度等于 1 现在我知道 lo 的长度等于 2 现在我知道 llo 的长度等于 3 现在我知道 ello 的长度等于 4 现在我知道 hello 的长度等于 5
ooolinux 2016-07-12
  • 打赏
  • 举报
回复
// Note:Your choice is C++ IDE #include <iostream> using namespace std; int mystrlen(const char *s) { if(*s=='\0') { printf("递归到了\"\\0\"串了,返回空串的长度等于0,这个出口很重要,避免了函数的死循环\n"); return 0; } printf("我现在还不知道 %s 的长度等于多少,我把它交给 1 + mystrlen(%s)\n",s,s+1); int len=mystrlen(s+1)+1; printf("现在我知道 %s 的长度等于 %d\n",s,len); return len; } int main() { mystrlen("hello"); return 0; }
小灸舞 版主 2016-07-12
  • 打赏
  • 举报
回复
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出
paschen 2016-07-12
  • 打赏
  • 举报
回复
单步跟踪程序运行是最好判断你理解正确与否的方法
ooolinux 2016-07-12
  • 打赏
  • 举报
回复
你要理解strlen(s+1)是什么? 第一次调用:strlen("ello") 第五次返回:3+1=4 第二次调用:strlen("llo") 第四次返回:2+1=3 第三次调用:strlen("lo") 第三次返回:1+1=2 第四次调用:strlen("o") 第二次返回:0+1=1 第五次调用:strlen("\0") 第一次返回:0 最后return (*s ? strlen(s+1) +1 :0) ;// *s='H',所以返回4+1=5

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧