5

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

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

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

int main() 
{ 
    test();
}
4

5 回答 5

7

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

如果函数在没有返回语句的情况下到达末尾,则返回除main函数外的未定义值,则返回 0。这与上面的原因相同。

/* implicit declaration of printf as: int printf(int); */

/* implicit int type */
main()
{
    printf("hello, world\n");
} /* implicit return 0; */
于 2012-06-01T23:13:08.283 回答
7

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

这与您可以使用register代替register int,或unsigned代替unsigned intauto代替auto int,和static代替的原因相同static int。我个人总是用 明确限定我的变量int,但是否这样做是你的选择。

于 2012-06-01T23:08:20.523 回答
3

到目前为止,我还没有看到任何答案都很好地解决了原因。在 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));
}

这个例子有点做作,但如果返回类型是一个巨大的结构,需要很长时间才能返回,它实际上可能变得有意义。

于 2012-06-02T03:20:21.613 回答
3

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

于 2012-06-01T23:08:18.583 回答
0

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

于 2012-06-01T23:19:15.737 回答