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

时间:2012-06-01 23:06:00

标签: c

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

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

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

int main() 
{ 
    test();
}

5 个答案:

答案 0 :(得分:7)

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

这与您使用register代替register intunsigned代替unsigned intauto而不是{{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.