В предыдущих примерах функции либо вообще не возвращали результирующих значений (void), либо возвращали значения типа int. А как быть, когда результат функции должен иметь другой тип? Многие вычислительные функции, как, например, sqrt, sin и cos, возвращают значения типа double; другие специальные функции могут выдавать значения еще каких-то типов. Чтобы проиллюстрировать, каким образом функция может возвратить нецелое значение, напишем функцию
Прежде всего отметим, что объявлять тип возвращаемого значения должна сама
#include ‹ctype.h›
/*atof: преобразование строки s в double */
double atof (char s[])
{
double val, power;
int i, sign;
for (i = 0; isspace(s[i]); i++)
; /* игнорирование левых символов-разделителей */
sign = (s[i] == '-') ? -1 : 1;
if (s[i] == '+' || s[i] == '-')
i++;
for (val = 0.0; isdigit(s[i]); i++)
val = 10.0 * val + (s[i] - '0');
if (s[i] == '.')
i++;
for (power = 1.0; isdigit(s[i]); i++) {
val = 10.0 * val + (s.[i] - '0');
power *= 10.0;
}
return sign * val / power;
}
Кроме того, важно, чтобы вызывающая программа знала, что
#include ‹stdio.h›
#define MAXLINE 100
/* примитивный калькулятор */
main
{
double sum, atof (char[]);
char line[MAXLINE];
int getline (char line[], int max);
sum = 0;
while (getline(line, MAXLINE) › 0)
printf ("\t%g\n", sum += atof(line));
return 0;
}
В объявлении
double sum, atof (char[]);
говорится, что
Объявление и определение функции
Это последнее утверждение, вероятно, вызовет у вас удивление, поскольку ранее говорилось о необходимости соответствия объявлений и определений. Причина несоответствия, возможно, будет следствием того, что вообще отсутствует прототип функции, и функция неявно объявляется при первом своем появлении в выражении, как, например, в
sum += atof(line);
Если в выражении встретилось имя, нигде ранее не объявленное, за которым следует открывающая скобка, то такое имя по контексту считается именем функции, возвращающей результат типа
double atof;
то и в этом случае считается, что ничего об аргументах