2012-02-03 90 views
1

这可能是一个愚蠢的问题,但我正在通过K & R书练习C有点注意到,你不需要指定函数的返回类型。我认为C是一种强类型语言。这怎么可能 ?这类似于类型推断吗?也许他们让这样的事情,因为隐式转换,但有点混乱,看看这个..C自动返回类型

如:

#include<stdio.h> 

int main() 
{ 
    int c = funct(); 
} 

funct() 
{ 
    return 3; 
} 
+3

的“隐性'int' “通常被认为是不好的做法。不要使用它。 – 2012-02-03 22:17:39

+2

即使你将函数声明为一个返回字符的函数,你也不会有任何问题,因为它在它的使用后被原型化了。 你应该做的是在头文件(.h)中创建函数原型,然后在源文件(.c)的顶部包含它,然后在系统包含和库包含(按此顺序) – Eregrith 2012-02-03 22:23:04

+0

非常感谢所有回答 – Cemre 2012-02-03 22:37:10

回答

4

没有什么花哨;默认返回类型是int。

+4

只限于C89。在C99中,“default int”已被删除。 – dreamlax 2012-02-03 22:17:06

3

如果省略了返回类型,则默认为int

因此funct()返回一个类型int。这就是代码编译的原因。

尽管如此,现代编译器会警告您,如果您省略返回类型。 (这是完全不允许在C99和C++。)

编辑: 除此之外,在你的榜样,你不打电话之前声明funct()功能。

在C语言中,如果函数没有先前声明,它的名字在 发生后跟一个左括号的表达式,它是隐式声明为返回一个int并没有什么功能 被假设为 关于它的论点。

2

那么实际上这是(据我所知)在C99非标准(但被允许在C89 - 见注释),但大多数编译器承担如果没有指定的INT返回类型。但是,任何体面的编译器都应该对此发出警告,并且始终应该认真对待警告。

+0

这不是非标准的,C89允许它,但C99不允许。 – dreamlax 2012-02-03 22:15:33

+0

编辑我的答案 - 但如果C99不允许,它实际上是非标准的,不是吗? – 2012-02-03 22:17:43

+0

是,否; C99并不像C89那样被广泛采用,所以如果您选择采用C99,那只是“非标准”。如果你想继续使用旧的C89标准,你可以(一些用于可编程微芯片的编译器仅限于C89)。 – dreamlax 2012-02-03 22:19:28

1

在老版本的C,函数返回类型和参数没有类型将默认为int如果没有指定类型,虽然这已经从C99去除起,凡功能必须声明,并用返回类型定义,并且参数必须被指定一个类型。

3

当省略类型说明符(例如函数的返回类型)时,C89有一个隐含的int规则。

C99不再允许省略类型说明符类型。

当你引用ķ& R2,书中明确地解释它(在4.1基本功能):

如果省略返回类型,假设INT