我使用循环打印以下模式:
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);
}
}
答案 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(),因为没有理由以递归方式调用它,所以根本就不要这样做。