C功能输出

时间:2015-03-23 17:19:33

标签: c

有谁可以告诉我将0 1 2 0作为以下程序输出的原因?

#include <stdio.h>

main() {

    e(3);

}

void e(int n) {

    if(n>0) {
        e(--n);
        printf("%d",n);
        e(--n);
    }

}

输出为0 1 2 0

4 个答案:

答案 0 :(得分:4)

下面&#39;从e(3)调用main之后的执行流程。

e(3)
   e(2) 
      e(1) 
         e(0) ... return
         n is now 0
         print n. results in output 0
         e(-1) ... return
      n is now 1
      print n. results in output 1
      e(0) ... return
   n is now 2
   print n. results in output 2
   e(1) 
      e(0) ... return
      n is now 0
      print n. results in output 0
      e(-1) ... return
   return

你看到了输出

0 1 2 0

答案 1 :(得分:2)

我假设您想要以下内容:

#include <stdio.h>

void e(int);

int main()
{
    e(3);
    return 0;
}

void e(int n)
{
    if(n > 0) {
        e(--n);
        printf("%d", n);
        e(--n);
    }
}

这是一个递归函数的例子 - 一个调用自身的函数。这里,在每次调用时,参数递减,并且再次调用函数,直到不满足条件n > 0。然后,printf("%d", 0)发生了。现在第二个e(--n)n至少2之前无效,因为if条件无法传递,其值n小于1 {1}}。进一步printf()以与调用相反的顺序发生,因为函数调用将从堆栈中删除。当值达到2时,第二个e(--n)有机会产生效果,从而打印0

你需要了解递归(如果你还没有),那么你就可以很好地了解事情是如何发生的。此外,如果了解有关在调用函数时如何设置堆栈以及稍后返回的更多内容,它将对您有所帮助。

答案 2 :(得分:0)

在解密代码之后,可以在调试器中一次性推断出结果的原因。

e()是递归的,在打印之前调用一次,之后调用一次。所以在你打印你的打印声明之前,你必须再次经历e,然后再次经历,直到最终达到0。

之后事情就开始解体了,你会看到印刷品突然出现,但由于第二次调用e(n),其中n进入负数,因此它仍然是一个很大的递归混乱。我很感激n被签名,因为如果它是无符号的,它将循环到2 ^ 32并且程序将陷入,几乎是无限循环。

所以是的,TL; DR:通过调试器运行它并从FUBAR中学习这样的递归。

答案 3 :(得分:0)

&#39;流程&#39;如下:

main -> e(3)
e(3) -> IF(3>0)
{
    // n is pre-decremented to 2
    e(2) -> IF(2>0)
    {
        // n is pre-decremented to 1
        e(1) -> IF(1>0)
        {
            // n is pre-decremented to 0
            e(0) -> 0 is not > 0 so this call does nothing.
            // n is still 0 in this function call so...
            printf(0)  <-- The first '0' in the output
            // n is pre-decremented to -1
            e(-1) -> -1 is not > 0) so this call does nothing.
        }
        // n is still 1 in this function call so...
        printf(1)  <-- The '1' in the output
        // n is pre-decremented to 0
        e(0) -> 0 is not > 0 so this call does nothing
    }
    // n is still 2 in this function call so...
    printf(2)  <-- The '2' in the output
    // n is pre-decremented to 1
    e(1) -> (1 is > 0)
    {
        // n is pre-decremented to 0
        e(0) -> 0 is not > 0 so this call does nothing
        // n is still 0 in this function call so...
        printf(0)  <-- The second '0' in the output
        // n is pre-decremented to -1
        e(-1) -> -1 is not > 0 so this call does nothing
    }
}

如果您更清楚地设置代码会有所帮助:

#include<stdio.h>

main()
{
    e(3);
}

void e(int n)
{
    if(n>0)
    {
        e(--n);    //  First recursion here, but with n=n-1 on entry to the call.
        printf("%d",n);  // outputs (original value of n) - 1.
        e(--n);    // Second recursion here, now with n=n-2 on entry to the call.
    }
}