定義がソースコードの最後に記述されているときに、C言語でデータと関数の*宣言*が必要なのはなぜですか?
次の「C」コードを検討してください。 #include<stdio.h> main() { printf("func:%d",Func_i()); } Func_i() { int i=3; return i; } Func_i()はソースコードの最後に定義され、で使用する前に宣言は提供されませんmain()。コンパイラがFunc_i()入っmain()てきたまさにその時に、それは出てきてmain()見つけ出しFunc_i()ます。コンパイラは、どういうわけかによって返された値を見つけ、Func_i()それをに渡しprintf()ます。また、コンパイラはの戻り値の型を見つけることができないことも知っていますFunc_i()。それは、デフォルトでは、(guesses?)の戻り値の型を取りFunc_i()ますint。つまり、コードにfloat Func_i()エラーがあった場合、コンパイラは次のエラーを出しFunc_i()ます。 上記の議論から、次のことがわかります。 コンパイラは、によって返された値を見つけることができますFunc_i()。 コンパイラがFunc_i()出てmain()きてソースコードを検索することによって返された値を見つけることができる場合、明示的に言及されているFunc_i()のタイプを見つけることができないのはなぜですか。 コンパイラFunc_i()は、それがfloat型であることを認識している必要があります。そのため、競合する型のエラーが発生します。 コンパイラがそれFunc_iがfloat型であることを知っている場合、なぜFunc_i()int型であると仮定して、競合する型のエラーを与えるのですか?強制的にFunc_i()float型にしないでください。 変数宣言にも同じ疑問があります。次の「C」コードを検討してください。 #include<stdio.h> main() { /* [extern int Data_i;]--omitted the declaration */ printf("func:%d and Var:%d",Func_i(),Data_i); } Func_i() { int i=3; return i; } int Data_i=4; コンパイラーはエラーを示します:'Data_i' undeclared(この関数で最初に使用)。 コンパイラがを見るとFunc_i()、Func_()によって返された値を見つけるためにソースコードに行きます。コンパイラが変数Data_iに対して同じことをできないのはなぜですか? 編集: コンパイラ、アセンブラ、プロセッサなどの内部動作の詳細はわかりません。私の質問の基本的な考え方は、使用後にソースコード内の関数の戻り値を伝える(書き込む)とその関数の「C」言語により、コンピューターはエラーなしでその値を見つけることができます。さて、なぜコンピューターは同様にタイプを見つけることができません。Func_i()の戻り値が見つかったため、Data_iのタイプが見つからないのはなぜですか。extern data-type …