Вопросы о прототипах и компиляции функций C

Со следующим кодом:

int main(){
    printf("%f\n",multiply(2));
    return 0;
}

float multiply(float n){
    return n * 2;
}

Когда я пытаюсь скомпилировать, я получаю одно предупреждение:% Е» надеется 'двойной», но аргумент имеет тип 'ИНТ» и две ошибки:конфликтующие типы для 'умножить ","предыдущая неявная декларацияумножать» был здесь."

Вопрос 1: Я предполагаю, что этопотому что, учитывая, что компилятор не знает функции 'умножать» когда он сталкивается с этим в первый раз, он изобретает прототип, а изобретенные прототипы всегда предполагаютINT» возвращается и принимается как параметр. Таким образом, изобретенный прототип будетint multiply (int) "и, следовательно, ошибки. Это правильно?

Теперь предыдущий код выигралт даже компилировать. Однако, если я разбью код на два файла, как это:

#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 " он все равно выдаст одно предупреждение (что printf ожидает double, но получает int), но ошибки победили 'больше не появится, и он скомпилируется.

вопрос 2: Как получилось, когда я разбил код на 2 файла, которые он компилирует?

Вопрос 3: После запуска вышеуказанной программы (версия разделена на 2 файла) на экране отображается 0,0000. Как так? Я предполагаю, что компилятор снова изобрел прототип, который нене соответствует функции, но почему печатается 0? И если я изменю printf ("% F») в printf ("% D») он печатает 1. Опять любое объяснение того, чтопроисходит за кулисами?

Заранее большое спасибо.

Ответы на вопрос(4)

Ваш ответ на вопрос