当我准备即将到来的期末考试时,我遇到了这个复习问题,当我调用test_b(4)时,我知道答案是:0 2 4。我的问题是,如果第一个2在cout之前,为什么它在cout之后打印2和4
void test_b(int n)
{
if (n>0)
test_b(n-2);
cout << n << " ";
}发布于 2017-05-10 22:47:06
考虑一下V形式的调用:
test_b(4)
| //>0, so enter the if
| test_b(2)
| | //>0 so enter the if
| | test_b(0)
| | | //==0, so skip if
| | | print 0 // from the test_b(0)
| | | return
| | print 2 // from test_b(2)
| | return
| print 4 // from test_b(4)
| return
// end结果如图所示,先是0,然后是2,最后是4: 0 2 4。
发布于 2017-05-10 22:42:00
简而言之,在(n > 0)为false之前不会打印任何内容,并且命中递归块。
当堆栈展开时,您将获得从0开始的输出,并且实际上是递增2。
逐行调试器在查看这样的内容时总是很有帮助的。
发布于 2017-05-10 22:46:37
test_b(4)的求值将生成三个嵌套调用。在第一个调用中,条件为真,因此它进行第二个调用;在第二个调用中,条件为真,因此它进行第三个调用。在第三个调用中,条件为false -在那个级别为n=0 -因此它直接跳到输出并输出它的值n,即0。然后,第三个调用返回到第二个调用-对于n=2 -并继续输出并打印2。然后第二个调用返回到第一个调用-对于n=4 -并继续到输出并打印4。然后第一个调用结束。
https://stackoverflow.com/questions/43895656
复制相似问题