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