我有一个这样的程序。
#include<stdio.h>
#include<stdlib.h>
int main(int i) { /* i will start from value 1 */
if(i<10)
printf("n%d",main(++i)); /* printing the values until i becomes 9 */
}
output :
5
2
2
2
有人能解释一下产量是怎么来的吗??每次迭代返回的main(++i)是什么。如果我删除printf函数中的,它也会产生输出5111。提前谢谢。
首先,main()
的声明应该是int main(int argc, char **argv)
。你不能修改它。即使您的代码进行了编译,系统也会按照预期的方式调用main()
,第一个参数是程序的参数数量(如果没有给定参数,则为1)。不能保证它永远是1。如果您使用其他参数运行程序,此数字将会增加。
其次,您的printf()
正试图打印main(++i)
的返回值,然而,您的main()
根本不返回任何内容。如果你希望在这里看到任何一致性,你必须给你的函数一个返回值。
最后,你不应该调用自己程序的入口点,更不用说用递归了。为这些东西创建一个单独的函数。
以下是C草案标准(N1570)对main
:的说明
5.1.2.2.1程序启动
1程序启动时调用的函数名为
main
。实现声明否该函数的原型。它应定义为返回类型int
,并且没有参数:int main(void) { /* ... */ }
或者具有两个参数(这里称为
argc
和argv
,尽管任何名称都可以是使用,因为它们是声明它们的函数的本地):int main(int argc, char *argv[]) { /* ... */ }
或等效的或以某种其他实施方式定义的方式。
显然,程序中的main
函数不是上述两种形式。除非您的平台支持您正在使用的表单,否则您的程序将显示未定义的行为。
这个程序到处都有未定义的行为(UB),如果你的程序中有一个实例的未定义行为,你就不能安全地假设你的程序的任何输出或行为-它可以合法地发生任何事情(尽管在现实世界中,效果通常在代码中UB的位置附近本地化。列出的旧C90标准有100多种UB情况(如果我记得没错的话),顶部有未知数量的UB,这是该标准没有描述的情况下的行为。对于每个C和C++标准,都存在一组UB的情况。
在您的情况下(没有咨询标准)UB的实例至少是:
- 不返回用返回值声明的函数的值。(例外:第一次打电话给main-谢谢Jim的评论)
- 定义(和调用)main,而不是使用标准的预定义形式,或者由编译器指定(作为实现定义的行为)
由于您的程序中至少有一个UB实例,因此对结果的猜测在某种程度上。。。推测性的,必须对编译器、操作系统、硬件,甚至并行运行的软件做出假设,这些假设通常没有文档记录或是已知的。
您没有初始化i,因此默认情况下,值将取自存储在RAM中的地址。
如果在重新启动计算机后多次运行此代码,则此代码将产生垃圾输出。
输出也将取决于编译器。
我甚至对编译感到惊讶。
当操作系统实际运行程序并调用main()时,会向其传递两个32(或64)位的值。您可以通过声明main(void)来忽略它们,也可以通过声明main(int argc,char**args)来使用它们。
正如上面的原型所示,传递的第一个值是传递给进程的命令行参数的数量,第二个值是指向这些参数列表存储在内存中的位置的指针,可能存储在程序的本地堆栈上。
argc的值总是至少为1,因为args中的第一个项字符串总是由操作系统生成的程序本身的名称。
关于你的意外输出,我想说的是,有些东西没有被提取或推到堆栈上,所以变量被混淆了。这可能是由于main()的参数列表不完整,或者您已经声明main返回int,但没有返回任何内容。
我认为,main方法在main方法内部调用自己。要增加变量的值,i++在它增加之前打印i的值,而++i在打印i的数值之前先增加i的值。
你可以用这个。。
int x=0;
main()
{
do
{
printf(x++);
}while (i<10);
}