为什么递归中不给return还能将正确的值返回给主函数

SUMNUSSARONG 2017-02-20 11:22:01
代码如下:

int mystrlen(char s[], int n)
{
if (s[n])
{
mystrlen(s, n + 1);
}
else
{
return n;
}
}
int main(void)
{
printf("%d\n", mystrlen("hello", 0));
return 0;
}


为什么可以返回呢?
...全文
779 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Barry.Lee 2020-07-18
  • 打赏
  • 举报
回复
我也遇到了一样的问题,哭了
我写return和不写return得到的结果都一样,只是提交之后不写return的就算输出一样它也不让通过
paschen 2017-02-22
  • 打赏
  • 举报
回复
引用 9 楼 SUMNUSSARONG 的回复:
[quote=引用 8 楼 paschen 的回复:] 字符串最后是以\0结尾 mystrlen(s, n + 1); 递归调用时,每次n会加1,直到字符串最末尾时就不再递归了
谢谢你的回答,但是我希望知道的是最上层也就是返回到主函数的那里,没有return为什么最终却返回了一个正确的值[/quote] 这只是碰巧,返回值一般是被放在EAX寄存器中,最后一次递归调用时返回的值在EAX中,之后函数没有更改EAX中的值,所以返回到主函数中这个值仍然是最后的值
SUMNUSSARONG 2017-02-22
  • 打赏
  • 举报
回复
引用 8 楼 paschen 的回复:
字符串最后是以\0结尾 mystrlen(s, n + 1); 递归调用时,每次n会加1,直到字符串最末尾时就不再递归了
谢谢你的回答,但是我希望知道的是最上层也就是返回到主函数的那里,没有return为什么最终却返回了一个正确的值
Rookiekk 2017-02-21
  • 打赏
  • 举报
回复
最后有一个字符'/0'表示字符结束,所以可以
ipqtjmqj 2017-02-21
  • 打赏
  • 举报
回复
编译严格一点这样的代码会有个警告,因为if中没有return
a149979032 2017-02-21
  • 打赏
  • 举报
回复
后面有个‘\0’
paschen 2017-02-21
  • 打赏
  • 举报
回复
字符串最后是以\0结尾 mystrlen(s, n + 1); 递归调用时,每次n会加1,直到字符串最末尾时就不再递归了
小灸舞 2017-02-21
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
  • 打赏
  • 举报
回复
字符串后面有个'\0'不满足if条件。加关注,一起学习,我也是学C/C++的
wizard_tiger 2017-02-21
  • 打赏
  • 举报
回复
"hello"字符串后面有一个字符'/0'表示字符结束。
sssunhudong 2017-02-20
  • 打赏
  • 举报
回复
"hello" 字符串(c风格) 末尾隐含了一个数值0,当s[5]的时候返回0 退出

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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