Язык программирования C



         

Функции, возвращающие нецелые значения - часть 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 значение функции atof, имеющее тип double, автоматически преобразуется в int, поскольку функция atoi возвращает int. (Как обсуждалось в лекции №2, преобразование значения с плавающей точкой к типу int осуществляется посредством отбрасывания дробной части).

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

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




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