为什么return后函数继续运行???

DAVIDWU2538 2018-05-19 10:58:35
#include<iostream>
using namespace std;
bool Find(char *A, char *B, char *C, int m, int n, int s) {
if (s == -1) return true;
else if (m == -1 || n == -1) return false;
else {
if (A[m] == B[n] && B[n] == C[s]) Find(A, B, C, m - 1, n - 1, s - 1);
if (C[s] != B[n] && A[m] != C[s]) Find(A, B, C, m - 1, n - 1, s);
if (A[m] != B[n] && A[m] == C[s]) Find(A, B, C, m, n - 1, s);
if (A[m] != B[n] && B[n] == C[s]) Find(A, B, C, m - 1, n, s);
}
}
int main() {
char a[7] = "abc123";
char b[7] = "adc234";
char c[4] = "a23";
int x;
x = Find(a, b, c, 5, 5, 2);
cout << x << endl;
system("pause");
return 0;
}

这个函数出来结果居然是51???
然后我在vs上加断点发现走到return true语句后居然继续走到else里面继续判断了
可是return后不是应该函数就结束了么?
求问各位这到底是为什么?初学者已经懵了。。。
...全文
2205 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
wyfwx 2018-07-12
  • 打赏
  • 举报
回复
你看到的是s不满足条件时的
_肆 2018-07-12
  • 打赏
  • 举报
回复
这是递归啊,在find里面调用find,find里面再调用find,层层find嵌套,直到遇到第一次return跳出最里面的find,然后不断执行再跳出次一级的find,就和for里面还有个for一样啊
weixin_42359982 2018-07-11
  • 打赏
  • 举报
回复
引用 16 楼 goldenhawking 的回复:
你的代码写的太密集了。调试时,根据行为单位的。尽量让每一行干一个事情。建议:

#include<iostream>
using namespace std;
bool Find(char *A, char *B, char *C, int m, int n, int s) {
if (s == -1)
return true;
else if (m == -1 || n == -1)
return false;
else
{
if (A[m] == B[n] && B[n] == C[s])
Find(A, B, C, m - 1, n - 1, s - 1);
if (C[s] != B[n] && A[m] != C[s])
Find(A, B, C, m - 1, n - 1, s);
if (A[m] != B[n] && A[m] == C[s])
Find(A, B, C, m, n - 1, s);
if (A[m] != B[n] && B[n] == C[s])
Find(A, B, C, m - 1, n, s);
}
}
int main() {
char a[7] = "abc123";
char b[7] = "adc234";
char c[4] = "a23";
int x;
x = Find(a, b, c, 5, 5, 2);
cout << x << endl;
system("pause");
return 0;
}

再调试。有时候断点断到一行,不一定意味着这一行的所有汇编都执行完了。比如你的IF


呵呵,不行的,我看了下,楼主的Find函数里的if else根本就没罗列出所有情况,单单第一遍就找不到一种符合if或者else的条件,所以Find函数执行一遍下来屁都没放一个,也就根本没有返回值
  • 打赏
  • 举报
回复
你的代码写的太密集了。调试时,根据行为单位的。尽量让每一行干一个事情。建议:

#include<iostream>
using namespace std;
bool Find(char *A, char *B, char *C, int m, int n, int s) {
if (s == -1)
return true;
else if (m == -1 || n == -1)
return false;
else
{
if (A[m] == B[n] && B[n] == C[s])
Find(A, B, C, m - 1, n - 1, s - 1);
if (C[s] != B[n] && A[m] != C[s])
Find(A, B, C, m - 1, n - 1, s);
if (A[m] != B[n] && A[m] == C[s])
Find(A, B, C, m, n - 1, s);
if (A[m] != B[n] && B[n] == C[s])
Find(A, B, C, m - 1, n, s);
}
}
int main() {
char a[7] = "abc123";
char b[7] = "adc234";
char c[4] = "a23";
int x;
x = Find(a, b, c, 5, 5, 2);
cout << x << endl;
system("pause");
return 0;
}

再调试。有时候断点断到一行,不一定意味着这一行的所有汇编都执行完了。比如你的IF
JackyRao 2018-07-05
  • 打赏
  • 举报
回复
这是递归, 压栈, 后弹出过程
棉猴 2018-06-27
  • 打赏
  • 举报
回复
Find()函数中,不是所有的if-else分支都返回bool类型。
    else {
if (A[m] == B[n] && B[n] == C[s]) Find(A, B, C, m - 1, n - 1, s - 1);
if (C[s] != B[n] && A[m] != C[s]) Find(A, B, C, m - 1, n - 1, s);
if (A[m] != B[n] && A[m] == C[s]) Find(A, B, C, m, n - 1, s);
if (A[m] != B[n] && B[n] == C[s]) Find(A, B, C, m - 1, n, s);
}

以上代码的执行会导致Find()函数没有返回值。所以,正如5楼所说的,把上述代码改为
	else {
if (A[m] == B[n] && B[n] == C[s])
return Find(A, B, C, m - 1, n - 1, s - 1);
if (C[s] != B[n] && A[m] != C[s])
return Find(A, B, C, m - 1, n - 1, s);
if (A[m] != B[n] && A[m] == C[s])
return Find(A, B, C, m, n - 1, s);
if (A[m] != B[n] && B[n] == C[s])
return Find(A, B, C, m - 1, n, s);
}

让每个分支都可以返回bool类型,此时的输出是1。
月凉西厢 2018-06-27
  • 打赏
  • 举报
回复
引用 4 楼 qq_36146748 的回复:
[quote=引用 2 楼 paschen 的回复:]
你走到的应该是if (s == -1) 语句,建议把if (s == -1) return true;拆成两行再进行调试

不行,没有差别,出来结果是51
[/quote]
那你改后,有没有再次莫名其妙地进到return ture里面去呢?结果是51那是另外一个问题了
月凉西厢 2018-06-27
  • 打赏
  • 举报
回复
你这代码风格。。
我就问你,你是怎么知道红色行的return true执行了的?
if (s == -1) return true;
else if (m == -1 || n == -1) return false;
yunshouhu 2018-06-27
  • 打赏
  • 举报
回复
递归程序就是这样子运行的吧,先弄明白什么是递归。
赵4老师 2018-05-21
  • 打赏
  • 举报
回复
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门! 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出
xiaoxiangqing 2018-05-20
  • 打赏
  • 举报
回复
有可能是调试器不是很准
Saleayas 2018-05-20
  • 打赏
  • 举报
回复
你的 Find 函数错误, if 需要 else 的。 否则你需要在最后添加一个 return 的。 你不能假定都在 if 里面。
真相重于对错 2018-05-19
  • 打赏
  • 举报
回复
你的是递归,所以返回后,执行的是递归的上一层代码!
paschen 版主 2018-05-19
  • 打赏
  • 举报
回复
你走到的应该是if (s == -1) 语句,建议把if (s == -1) return true;拆成两行再进行调试
yshuise 2018-05-19
  • 打赏
  • 举报
回复
重新编译
ueane 2018-05-19
  • 打赏
  • 举报
回复
调用是 第一次->第二次->第三次-> ... -> 第n次 在某一次return之后只会返回上一层的调用, 这样一直往上返回, 不是return一次就完事了, 调用了几次就返回几次
冷风1023 2018-05-19
  • 打赏
  • 举报
回复
你的是递归,所以返回后,执行的是递归的上一层代码,关键要看你代码执行到哪层了。
paschen 版主 2018-05-19
  • 打赏
  • 举报
回复
我不知你期望的是什么结果 if (A[m] == B[n] && B[n] == C[s]) Find(A, B, C, m - 1, n - 1, s - 1); 改成 if (A[m] == B[n] && B[n] == C[s]) return Find(A, B, C, m - 1, n - 1, s - 1); 同理其他几句
DAVIDWU2538 2018-05-19
  • 打赏
  • 举报
回复
引用 2 楼 paschen 的回复:
你走到的应该是if (s == -1) 语句,建议把if (s == -1) return true;拆成两行再进行调试
不行,没有差别,出来结果是51

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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