这两个程序有什么区别? 我得到的第一个是4,3,2,1,第二个是编译错误。
#include <stdio.h>
int main()
{
static int i = 5;
if (--i){
printf("%d ", i);
main(10);
}
}
和
#include <stdio.h>
int main(void)
{
static int i = 5;
if (--i){
printf("%d ", i);
main(10);
}
}
答案 0 :(得分:2)
在参数列表中出现单独的void
会明确告诉编译器“此函数不带参数”。
在第一个代码示例中,由于没有参数列表,因此允许递归调用main
,该列表允许任意数量的参数(在比您的编译器支持的最新C标准中可能已更改的参数列表) ;我忘记了细节。
声明为static
的变量存储在进程的数据部分中,而不是存储在堆栈存储器中,因此它们会超出其范围,并在函数调用之间保留其值,因此i
会在每次调用时递减,直到达到零,并且您的程序达到基本情况(不要输入if
语句),然后终止。
答案 1 :(得分:2)
当您定义这样的函数时:
int func() { ... }
它表示该函数接受不确定数量的参数并返回int
。因此,您可以合法地传递任意数量的任何类型的参数(尽管您将无法访问它们)。
当您定义这样的函数时:
int func(void) { ... }
它表示该函数接受 no 参数。尝试将任何参数传递给此函数将导致编译时错误。
另一方面,递归调用main
函数不是一个好主意。最好不要调用另一个递归函数或只使用循环。