我在 C 中实现了一些基本的数据结构,我发现如果我从函数中省略返回类型并调用该函数,编译器不会产生错误。我用编译cc file.c
但没有使用-Wall
(所以我错过了警告)但在其他编程语言中这是一个严重的错误,程序将无法编译。
根据 Graham Borland 的要求,这里有一个简单的例子:
int test()
{
printf("Hi!");
}
int main()
{
test();
}
我在 C 中实现了一些基本的数据结构,我发现如果我从函数中省略返回类型并调用该函数,编译器不会产生错误。我用编译cc file.c
但没有使用-Wall
(所以我错过了警告)但在其他编程语言中这是一个严重的错误,程序将无法编译。
根据 Graham Borland 的要求,这里有一个简单的例子:
int test()
{
printf("Hi!");
}
int main()
{
test();
}
C 是一门古老的语言,在它被引入的时候,返回整数已经足够普遍,可以作为函数的默认返回类型。人们后来开始意识到,对于更复杂的返回类型,最好指定 int 以确保您不会忘记返回类型,但为了保持与旧代码的向后兼容性,C 无法删除此默认行为。相反,大多数编译器都会发出警告。
如果函数在没有返回语句的情况下到达末尾,则返回除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 int
,auto
代替auto int
,和static
代替的原因相同static int
。我个人总是用 明确限定我的变量int
,但是否这样做是你的选择。
到目前为止,我还没有看到任何答案都很好地解决了原因。在 C 中,只要调用者不尝试使用返回值,具有非 void 返回类型的函数在没有返回语句/值的情况下结束是完全合法的。例如(有点不平凡的例子):
#include <stdio.h>
int foo(int want_result)
{
puts("hello");
if (want_result) return 42;
}
int main()
{
foo(0);
printf("%d\n", foo(1));
}
这个例子有点做作,但如果返回类型是一个巨大的结构,需要很长时间才能返回,它实际上可能变得有意义。
函数的返回类型是可选的,如果未指定,则视为“int”。
正如上面的答案所说,该函数不会返回 0。实际上,printf 返回一个值:打印的字符数。在您的情况下,printf 是您的测试函数中的最后一个表达式,它将返回 3。因此,函数test将返回 3。