我在C中实现了一些基本的数据结构,我发现如果从函数中省略返回类型并调用该函数,编译器就不会生成错误。我用cc file.c
编译并且没有使用-Wall
(所以我错过了警告)但是在其他编程语言中这是一个严重的错误,程序将无法编译。
Per Graham Borland的要求,这是一个简单的例子:
int test()
{
printf("Hi!");
}
int main()
{
test();
}
答案 0 :(得分:7)
这是因为在C中,任何变量/函数都是隐式的int
。
这与您使用register
代替register int
或unsigned
代替unsigned int
,auto
而不是{{1}的原因相同}和auto int
代替static
。我个人总是使用static int
明确限定我的变量,但不管你是否这样做都是你的选择。
答案 1 :(得分:7)
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; */
答案 2 :(得分:3)
函数的返回类型是可选的,如果未指定,则被视为“int”。
答案 3 :(得分:3)
到目前为止,我还没有看到为什么在任何答案中得到了很好的解决。在C中,只要调用者不尝试使用返回值,具有非void返回类型的函数在没有return语句/值的情况下结束是完全合法的。例如(稍微不重要的例子):
#include <stdio.h>
int foo(int want_result)
{
puts("hello");
if (want_result) return 42;
}
int main()
{
foo(0);
printf("%d\n", foo(1));
}
这个例子有点人为,但如果返回类型是一个庞大的结构,它可能会变得有意义,这将需要非常重要的时间来返回。
答案 4 :(得分:0)
如上面的答案所说,该功能不会返回0。实际上,printf返回一个值:打印的字符数。在你的情况下,printf是测试函数中的最后一个表达式,它将返回3.因此函数 test 将返回3.