在main()中调用main()
是否有可能在c中的main()
函数中调用main()
?
是的,C允许你调用你的主函数(而C ++ 不 )
从本身调用main()
的确是允许的,甚至可以避免使用与用于任何其他recursion代码相同的方法的堆栈溢出,例如:
#include <stdio.h> int main (int argc, char *argv[]) { printf ("Running main with argc = %d, last = '%s'\n", argc, argv[argc-1]); if (argc > 1) return main(argc - 1, argv); return 0; }
当它作为testprog 1 2 3
运行时,输出:
Running main with argc = 4, last = '3' Running main with argc = 3, last = '2' Running main with argc = 2, last = '1' Running main with argc = 1, last = 'testprog'
但是,既然这只是轶事证据,我们应该转向标准。 ISO C11第4 Conformance
节4 Conformance
状态:
1在本标准中,“应”被解释为执行或程序的要求; 相反,“不得”被解释为禁止。
2 /如果违反约束条件或运行时约束条件之外的“应该”或“不应该”要求被违反,则行为是不确定的。 未定义的行为在本标准中用“未定义的行为”或者省略任何明确的行为定义来表示。 这三者的重点没有区别。 他们都描述“未定义的行为”。
3 /对所有其他方面正确的程序,对正确的数据进行操作,包含不明确的行为应是一个正确的程序,按照5.1.2.3的规定行事。
现在,由于在main()
调用本身的标准中没有任何明确的禁止 ,所以上面第3节是控制方面。
进一步的支持可以在两个地方看到(我粗体),首先在第5.1.2.2.3 Program termination
节中5.1.2.2.3 Program termination
:
1 /如果
main
函数的返回types是与int
兼容的types,则从初始调用返回到main
函数相当于使用main
函数返回的值作为其参数来调用exit
函数;
然后在7.21.3 Files
节中的7.21.3 Files
:
5 /该文件可能随后被重新打开,通过相同或另一个程序执行,其内容被回收或修改(如果它可以在其开始时重新定位)。 如果
main
函数返回到其原始调用者,或者调用了exit
函数,则在程序终止之前closures所有打开的文件(因此所有输出stream都被刷新)。
这两个小节都支持可能会有其他的调用main()
而不是初始/最初的调用。
是的,我们可以在main()函数中调用main()。
由函数本身调用函数的过程称为recursion。
那么你可以在main()函数中调用main(),但是你应该有一个不调用main()函数来终止程序的条件。
否则,程序将永远不会返回并无限运行。
是的,你可以 。
简单程序:
int main() { printf("Anything"); main(); return 0; }
说明:
call stack
或function stack
用于几个相关的目的,但是有一个的主要原因是跟踪每个活动子例程在完成执行时应该返回的控制点。
在调用堆栈上使用太多的内存时,会发生stack overflow
。
这里函数main()
被重复调用,其返回地址存储在堆栈中。 堆栈内存已满。 它显示stack overflow error
。
是的 ,在C和C ++中都可以在main()中调用main()。 这是一个函数自我调用的“recursion”的概念。例如:
在C:
#include<stdio.h> int main() { static int i=1; // * printf("%d\n",i++); if(i==6) { return 0; } main(); // recursive call of main() }
在C ++中:
#include<iostream> using namespace std; int main() { static int i=1; // * cout<<i<<endl; i++; if(i==6) { return 0; } main(); // recursive call of main() }
这两个程序的输出 :
1 2 3 4 5
*在这里, static关键字用作基本检查来结束程序,否则main()将继续无限地调用它自己。 例如
1 1 1 1 1 1 1 1 1 1 1.. program ends abnormally.
这里的main()调用自己是无限的,因为如果我们不使用static关键字,每次在新的main()中创build一个初始值为1的新整数“i”。 所以,
if(i==6)
在recursion调用的每个main()中都是正确的,程序永远不会正常结束。
但是使用static关键字只会在第一次执行main()时创build整数“i”,并且在每次recursion调用main()的时候都会增加'i'的值,所以recursion在'i'变成6作为返回0; 执行。
更多信息。 关于static关键字: 带有静态variables的recursion函数
int static val; main() { if(val==0) { clrscr(); } while(val<3) { val++; printf("calld main\n",main()); } getch(); }
是的,可以在C和C ++中使主函数成为recursion函数。 我通过提交UVA问题(第10071号)进行testing,并接受了它。 这里的代码: 截图1 , 截图2
#include<stdio.h> int main(void) { int v,t,s; if(scanf("%d%d",&v,&t)==2) { s=2*(v*t); printf("%d\n",s); main(); } else return 0; }
对于C ++,
#include<iostream> using namespace std; int main(void) { int v,t,s; if(cin>>v>>t) { cout<<2*v*t<<endl; main(); } else return 0; }
这取决于编译器的使用,我已经写了一个程序在cfind自然数的总和,而不使用任何函数或转到唯一的帮助MAIN函数内写入主函数(我用一个condn终止)它已经nt给我需要在turbo c编译器中回答,但在devc ++中,它允许我编译程序并给出req输出。