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

Скачать в pdf «Язык программирования C»


printf(«t%gn», sum += atof(line)); return 0;

}


В программе имеется следующее объявление: double sum, atof (char [] ) ;


В нем говорится, что sum является переменной типа double, a atof — функцией, принимающей один аргумент типа char [] и возвращающей значение типа double.


Функция atof должна иметь согласованные между собой объявление и определение. Если сама функция atof и ее вызов в функции main имеют несогласованные типы и находятся в одном файле исходного кода, то компилятор выдаст сообщение об ошибке. Однако если (что более вероятно) функция atof компилируется отдельно, то несоответствие типов замечено не будет— функция возвратит число типа double, a main воспримет его как int, и в результате получится бессмыслица.


В свете всего сказанного насчет соответствия объявлений и определений функций это может показаться странным. Но дело в том, что здесь отсутствует прототип функции и функция объявляется неявным образом — своим первым появлением в таком выражении, как


sum += atof(line)


Если в выражении встречается имя, которое ранее не объявлялось, и если после него стоят круглые скобки, оно по контексту объявляется функцией. По умолчанию считается, что эта функция возвращает число типа int, а относительно ее аргументов не делается никаких предположений. Более того, если объявление функции не содержит аргументов, то и в этом случае не делается никаких предположений относительно их типа и количества, как в этом примере: double atof();


Проверка соответствия параметров для atof просто отключается. Это особое значение пустого списка аргументов введено для того, чтобы старые программы на С могли компилироваться новыми компиляторами. Однако использовать этот стиль в новых программах — дурной тон. Если функция принимает аргументы, объявляйте их. Если же она не принимает никаких аргументов, пишите void.

Скачать в pdf «Язык программирования C»