Во-первых, в языке Си не требуется предоставлять прототип для функции перед ее вызовом.В C99-версии языка есть требование объявить функцию перед ее вызовом, но все же нет необходимости предоставлять прототип.
Поскольку ваш компилятор не жаловался, вы должныиспользуя компилятор C89 / 90, а не компилятор C99.
Во-вторых, в C89 / 90, когда вы вызываете необъявленную функцию, передавая аргументы типа float
и char
, как в
printit(a,ch);
компилятор выполняет продвижение аргументов по умолчанию и фактически передает значения типа double
и int
.Ваша функция должна быть определена соответственно, чтобы код работал.Вы определили свою функцию как
printit(a, ch)
{
...
Это определение означает, что оба параметра имеют тип int
.Это нарушает вышеуказанное требование.Поведение вашего кода не определено.Больше не имеет смысла больше анализировать код или догадываться, почему он печатает что-то так, как печатает.Поведение вашего кода, опять же, не определено.
Правильное определение вашей (необъявленной) функции может выглядеть следующим образом
int printit(double a, int ch)
{
...
В качестве альтернативы, оно может быть определено в стиле K & R как
printit(a, ch)
float a;
{
...
Это, вероятно, заставит ваш код работать правильно.Тем не менее, гораздо лучший подход - предоставить прототип для printit
перед его вызовом.Какой прототип вы хотите использовать - void printit(double a, int ch)
или void printit(float a, char ch)
или что-то еще - вам решать.