2012-02-03 17 views
1

は、これは愚かな質問かもしれませんが、私はCを少し練習するK & R帳を通過して、あなたが関数の戻り値の型を指定する必要がないことに気づきました。私はCが強く型付けされた言語だと思った。これはどのように可能ですか?これは型推論のようなものですか?おそらく彼らは、これを見るためにための暗黙的な変換が、混乱してビットのこのような何かをしましょう。..C自動復帰タイプ

例:空想

#include<stdio.h> 

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

funct() 
{ 
    return 3; 
} 
+3

「暗黙の 'int'を想定しています"一般的に悪い習慣と考えられている。それを使用しないでください。 –

+2

そして、あなたがcharを返す関数としてfunctを宣言したとしても、その使用後にプロトタイプ化されているので、int変数に代入することに問題はありません。 あなたはすべてのために多くのヘッダファイル(.H)でFUNCTプロトタイピングおよびシステムが含まれており、ライブラリが(この順序で)含まれた直後のソースファイル(.C)の上部に – Eregrith

+0

おかげで、それを#includeされ何をすべき回答 – Cemre

答えて

4

何もありません。デフォルトの戻り値の型はintです。 int

+4

C89のみ。 C99では、 "default int"が削除されました。 – dreamlax

3

戻り値の型が省略された場合、デフォルト。

だからfunct()タイプintを返します。そのため、コードがコンパイルされます。

これはしかし減価償却されますが、戻り値の型を省略した場合、最近のコンパイラは警告を表示します。 (それは全くC99およびC++で許可されていません。)

EDIT:あなたはそれを呼び出す前に、 それに加えて、あなたの例では、あなたはfunct()関数を宣言しないでください。

:Cで

機能が以前に宣言され、その名前が に左括弧が続く式が発生していない場合、それは暗黙的に int型と何を返す関数として宣言されていますその引数については と仮定されています。

2

まあ、実際にこれがC99で(私の知る限り)非標準である(ただし、C89で許可された - コメントを参照)が、ほとんどのコンパイラ何も指定されていない場合int型の戻り値の型を想定しています。しかし、まともなコンパイラはこれに関する警告を出し、常に警告を真剣に受けなければなりません。指定なしタイプがなかった場合のタイプのないCの古いバージョンでは

+0

それは非標準ではない、C89は許したが、C99は許さなかった。 – dreamlax

+0

私の答えを編集しましたが、C99がそれを許さないのであれば、それは実際に非標準ですね。 –

+0

はい、いいえ。 C99はC89ほど広く採用されていないので、C99を採用することを選択した場合は「非標準」にすぎません。古いC89規格を引き続き使用したい場合(プログラマブルマイクロチップ用のコンパイラの中にはC89のみ) – dreamlax

1

、関数の戻り値の型と引数は、intをデフォルトとなり、これは機能が宣言され、戻り値の型を定義する必要があります以降C99、から削除されましたが、そして引数は、型で指定する必要があります。

3

C89は、(例えば、関数の戻り型)型指定が省略された暗黙intルールを有していました。

C99は、もはや型指定子タイプを省略することができません。

あなたはK & R2を引用すると、本は明示的に(4.1基本機能で)それを説明した:

戻り値の型が省略された場合、INTが