为什么即使缺少return语句,C语言中的程序也会编译?

我在C中实现了一些基本的数据结构,我发现如果从函数中省略返回类型并调用该函数,编译器就不会生成错误。 我使用cc file.c编译并且没有使用-Wall (所以我错过了警告)但是在其他编程语言中这是一个严重的错误,程序将无法编译。

根据Graham Borland的要求,这是一个简单的例子:

 int test() { printf("Hi!"); } int main() { test(); } 

C是一种古老的语言,在引入时,返回的整数很常见,是函数的默认返回类型。 人们后来开始意识到,对于更复杂的返回类型,最好指定int以确保您不会忘记返回类型,但为了保持与旧代码的向后兼容性,C无法删除此默认行为。 相反,大多数编译器会发出警告。

如果函数到达没有return语句的结尾,则返回未定义的值,但在main函数中返回0。 这与上述原因相同。

 /* implicit declaration of printf as: int printf(int); */ /* implicit int type */ main() { printf("hello, world\n"); } /* implicit return 0; */ 

这是因为在C中,任何变量/函数都是隐式int

这与使用register而不是register int ,或unsigned而不是unsigned intauto而不是auto int ,以及static而不是static int 。 我个人总是使用int明确限定我的变量,但是否是你的选择。

函数的返回类型是可选的,如果未指定,则被视为“int”。

到目前为止,我还没有看到为什么在任何答案中处理得好。 在C中, 只要调用者不尝试使用返回值 ,具有非void返回类型的函数在没有返回语句/值的情况下结束是完全合法的。 例如(稍微不重要的例子):

 #include  int foo(int want_result) { puts("hello"); if (want_result) return 42; } int main() { foo(0); printf("%d\n", foo(1)); } 

这个例子有点人为,但如果返回类型是一个巨大的结构,可能需要非常重要的时间返回,它实际上可能会变得有意义。

如上面的答案所说,该函数不会返回0。 实际上,printf返回一个值:打印的字符数。 在你的情况下,printf是测试函数中的最后一个表达式,它将返回3.因此函数test将返回3。