次のコードを使用します。
int main(){
printf("%f\n",multiply(2));
return 0;
}
float multiply(float n){
return n * 2;
}
コンパイルしようとすると、1 つの警告が表示されます。ここ。"
質問 1 : コンパイラが最初に関数 'multiply' に遭遇したときに関数 'multiply' の知識を持っていないことを考えると、彼はプロトタイプを発明し、発明されたプロトタイプは常に 'int' が返され、次のように解釈されると想定しているからだと推測しています。パラメータ。したがって、発明されたプロトタイプは「intmultiply(int)」になり、エラーが発生します。これは正しいです?
さて、前のコードはコンパイルさえしません。ただし、次のようにコードを 2 つのファイルに分割すると、次のようになります。
#file1.c
int main(){
printf("%f\n",multiply(2));
return 0;
}
#file2.c
float multiply(float n){
return n * 2;
}
「gcc file1.c file2.c -o file」を実行すると、警告が1つ表示されますが(printfはdoubleを期待しているが、intを取得しています)、エラーは表示されなくなり、コンパイルされます。
質問 2 : コードを 2 つのファイルに分割してコンパイルするとどうなりますか?
質問 3 : 上記のプログラム (2 つのファイルに分割されたバージョン) を実行すると、画面に 0.0000 が表示されます。どうして?コンパイラが関数に一致しないプロトタイプを再び発明したと推測していますが、なぜ 0 が出力されるのでしょうか? そして、printf("%f") を printf("%d") に変更すると、1 が出力されます。繰り返しますが、舞台裏で何が起こっているのか説明はありますか?
よろしくお願いします。