使用main函数递归以打印数字

时间:2015-09-15 12:20:03

标签: c recursion

我使用循环打印以下模式:

  

1 12 123 1234 12345

为什么以下代码在显示模式之前显示一些随机值?当我使用递归到一些随机函数func(int a, int b)并将值(1,1)从main传递给此函数时,它可以正常工作。

int a=1,b=1;
int main(int a, int b)
{
    if(a>5)
       return 0;

    else if(b<a)
    {
        printf("%d",b);
        main(a,++b);
    }

    else if(b==a)
    {
        printf("%d ",b);
        main(++a,1); 
    } 
}

2 个答案:

答案 0 :(得分:5)

根据C标准 1 main()函数的以下签名有效:

int main(void)

int main(int argc, char* argv[])

当您将命令行的参数传递给main()函数时(总是至少有一个:程序的名称始终是argv[]的第一个元素,即{{ 1}}),你得到奇怪的结果,因为参数被转换为你的整数值。

因此,您应该使用自己的函数进行递归任务,例如argv[0],如上所述。

1 注意:我的回答有点过于简单了。有关更详细和更准确的说明,请参阅this answer

答案 1 :(得分:2)

int main(int a, int b)不是main()的标准形式之一。

只允许编译器在极少数情况下更改main()的类型(listed here)。如果它这样做,会发生什么是实现定义的行为,编译器必须为程序员记录应该如何使用main。

程序员可能永远不会发明自己的主要自定义格式。

我非常怀疑曾经存在一个符合标准的编译器,其中int main(int a, int b)形式得到支持和记录。

很可能你在某些旧编译器上滥用main的参数缺乏类型安全性,这就解释了为什么它甚至首先编译。我怀疑你只是在调用未定义的行为,任何事情都可能发生。

由于你不允许发明你自己的main形式,因为没有理由调用main(),因为没有理由以递归方式调用它,所以根本就不要这样做。