Язык С




Функции, возвращающие нецелые значения - часть 2


Вторым, но столь же важным, является то, что вызывающая функция должна объявить о том, что ATOF возвращает значение, отличное от INT типа. Такое объявление демонстрируется на примере следующего примитивного настольного калькулятора /едва пригодного для подведения баланса в чековой книжке/, который считывает по одному числу на строку, причем это чис- ло может иметь знак, и складывает все числа, печатая сумму после каждого ввода.

#DEFINE MAXLINE 100 MAIN() /* RUDIMENTARY DESK CALKULATOR */ { DOUBLE SUM, ATOF(); CHAR LINE[MAXLINE];

SUM = 0; WHILE (GETLINE(LINE, MAXLINE) > 0) PRINTF("\T%.2F\N",SUM+=ATOF(LINE));

Оисание

DOUBLE SUM, ATOF();

говорит, что SUM является переменной типа DOUBLE , и что ATOF является функцией, возвращающей значение типа DOUBLE . Эта мнемоника означает, что значениями как SUM, так и ATOF(...) являются плавающие числа двойной точности.

Если функция ATOF не будет описана явно в обоих местах, то в "C" предполагается, что она возвращает целое значение, и вы получите бессмысленный ответ. Если сама ATOF и обраще- ние к ней в MAIN имеют несовместимые типы и находятся в од- ном и том же файле, то это будет обнаружено компилятором. Но если ATOF была скомпилирована отдельно /что более вероятно/, то это несоответствие не будет зафиксировано, так что ATOF будет возвращать значения типа DOUBLE, с которым MAIN будет обращаться, как с INT , что приведет к бессмысленным резуль- татам. /Программа LINT вылавливает эту ошибку/. Имея ATOF, мы, в принципе, могли бы с ее помощью напи- сать ATOI (преобразование строки в INT):

ATOI(S) /* CONVERT STRING S TO INTEGER */ CHAR S[]; { DOUBLE ATOF();

RETURN(ATOF(S)); }

Обратите внимание на структуру описаний и оператор RETURN. Значение выражения в

RETURN (выражение)

всегда преобразуется к типу функции перед выполнением самого возвращения. Поэтому при появлении в операторе RETURN значе- ние функции атоF, имеющее тип DOUBLE, автоматически преобра- зуется в INT, поскольку функция ATOI возвращает INT. (Как обсуждалось в главе 2, преобразование значения с плавающей точкой к типу INT осуществляется посредством отбрасывания дробной части).

Упражнение 4-2

---------------- Расширьте ATOF таким образом, чтобы она могла работать с числами вида

123.45е-6

где за числом с плавающей точкой может следовать 'E' и пока- затель экспоненты, возможно со знаком.




    Содержание  Назад  Вперед