Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有人能解释一下这个C程序的输出吗?_C - Fatal编程技术网

有人能解释一下这个C程序的输出吗?

有人能解释一下这个C程序的输出吗?,c,C,做代码下面的主;每次主递归调用发生并从该程序终止时执行时,都会将printf语句指令放入堆栈中。i通过对main的连续调用减少,直到达到零 然后为每个递归级别调用printf 注意,调用main的行为是定义良好的,尽管C中的建议不正确,但是C++中的行为是未定义的。 这将在第一次计算为true-i==4。代码递归到main.:调用自身的函数 与我一样,它将保留其值4,而不是自动变量,自动变量将再次初始化为5。main的第二次执行中的if-i将再次为true,并将再次调用main以执行函数的第三次

做代码下面的主;每次主递归调用发生并从该程序终止时执行时,都会将printf语句指令放入堆栈中。

i通过对main的连续调用减少,直到达到零

然后为每个递归级别调用printf

注意,调用main的行为是定义良好的,尽管C中的建议不正确,但是C++中的行为是未定义的。 这将在第一次计算为true-i==4。代码递归到main.:调用自身的函数

与我一样,它将保留其值4,而不是自动变量,自动变量将再次初始化为5。main的第二次执行中的if-i将再次为true,并将再次调用main以执行函数的第三次执行

对于-i==2和-i==1,对于main的四次执行也是一样的,包括第一次非递归的总计,它们将if条件求值为true

下一个递归将if条件求值为-i==0,因此为false。跳过if子句,函数调用将返回。在这一点上,i是零,并且-是静态的,即对于main的所有实例,只有一个持久i-将保持该值

堆栈上一级的main调用-求值为-i==1的调用,然后调用main并等待它返回-现在将在调用main后继续执行语句,并打印i的当前值printf。。。也就是0

同样的情况还会发生三次,总共发生四次,直到最上面的主体返回。你会得到四倍于i当前值的值,即0

<>注意,从程序中调用main是允许在C中进行的,但不是C++中的。这是专门用于递归调用main的;对于其他函数,它在两种语言中都是允许的。

-i将在第一次调用时将i的值减小到4,并且由于递归,它将继续减小i直到i==0。
由于您使用static关键字声明了变量i,因此为其分配了一个内存,所有更改都会反映回它

这是基本的递归。我建议你仔细阅读它以及静态是如何工作的。欢迎来到SO。请始终显示您当前的努力,并告诉我们您到底在哪里遇到了问题。如果输出不是您期望的,请告诉我们您期望的。@DevSolar该网站应该建立一个可搜索的知识库,其他人可以将其用作参考网站。。。一个题为“有人能解释这个程序的输出吗?除了代码之外,没有更多的文本”的问题是不可能帮助任何人的else@M.M:此网站还应帮助用户解决问题;我们是否因为给他们一个更好的标题就需要OP对这个问题所不具备的知识而否决了这些问题?如果他知道所有关于静态和递归的知识,他就不用问了。事实上,这个问题已经在同一个程序中被问了至少5次了。我把它作为一个复制到我发现的最老的一个。调用main不是C++中未定义的。它的使用是被禁止的。@Peter:你知道吗?编译器不必发出诊断。@ Bathesba -在1998 C++标准中的实际措辞是函数不应在程序中使用3.2。在第3.2节中,如果函数或对象的名称出现在可能计算的表达式中,则称该函数或对象已被使用。在任何讨论中都没有引用,没有诊断要求或未定义行为——这意味着第1.4节是一个可诊断的规则。@皮特,我想你应该在C++标签上问一个问题。如果OP移除静态,它将是无限循环,没有输出。Primtf语句将在什么阶段执行?这些指令是否会在堆栈中,并在从整个程序弹出时执行?
#include <stdio.h>

int main()
{
    static int i = 5;

    if (--i)
    {
        main();
        printf("%d\n", i); // will this line executes ?
    }

    return 0;
} 
0
0
0
0
if (--i)