Я отвечу снова (и надеюсь, что вас не уценят).Так как вы, похоже, все еще в замешательстве.
Наследие языка C также смущает это, потому что в ранней версии C были разрешены некоторые вещи, которые теперь считаются плохой практикой.Но по причинам совместимости они все же разрешены.C ++ не позволяет им (отсюда мой комментарий в моем другом ответе).
Первое, что нужно знать, это то, что c и c ++ читают исходный файл сверху вниз, чтобы понять, что вы делаете;они не смотрят вперед, не возвращаются и не корректируют свою интерпретацию, если находят новую информацию (в отличие от, скажем, C #).
Так что в вашем коде, когда компилятор видит
fun(x,x,x);
Это спрашивает себя.«Я знаю, что такое« весело ».Ответ: нет.Компилятор c ++ в этот момент откажется
x.cpp: In function ‘int main()’:
x.cpp:4: error: ‘fun’ was not declared in this scope
Чтобы исправить это, вы должны объявить fun прежде, чем (имеется в виду ранее в исходном файле) вы попытаетесь использовать его.Вы делаете это, помещая
void fun(float, float);
в начале файла.Это говорит компилятору: «где-то будет функция« fun », которая принимает 2 float», компилятор знает, что делать то, что он потом видит, вызов fun.
Теперь, что с Си.чтобы быть полезным (или не зависящим от вашей точки зрения)
C пытается угадать, что вы имеете в виду (учитывая, что вы ничего не сказали)
fun(x,x,x);
по умолчанию предполагается, чтоfun - это функция, которая принимает 3 int и возвращает int.Он считает, что это может быть правильно, и если это не так, то вы исправите это. Примечание - он не смотрел, какие параметры вы пытались передать в удовольствие.Он просто решает, что все неизвестные функции принимают и возвращают целые числа.
Итак, теперь вы ознакомились с правилами продвижения и т. Д. Вы пытались вызвать функцию, которая принимает целочисленные значения, передавая значения типа float или double.Это будет работать
В своем вопросе вы говорите, что float не работает, но работает дважды.В моих тестах оба компилируются, но я получаю предупреждение компилятора.Однако у вашего определения fun нет возвращаемого типа (в данном случае void).Если я использую ваш точный синтаксис, то ни один из них не компилирует
Advice, всегда сначала объявляйте функции.Используйте C ++ как «лучший компилятор C».Это намного строже и полезнее.