Почему Керниган и Ритчи не используют int для основных функций?

Каждый выполненный пример завершается с помощью main без «int». Почему это и почему он все равно компилируется без него. Созданы ли компиляторы C с int?


person Jinzu    schedule 30.01.2019    source источник
comment
K&R предшествует стандарту C   -  person Govind Parmar    schedule 30.01.2019
comment
K&R 1st Edition от 1978 года предшествует стандарту C более чем на десятилетие. Тем не менее, это был один из основных входов в стандарт. 2-е издание K&R от 1988 года немного предшествует стандарту C89 ANSI и стандарту C90 ISO, но к моменту публикации книги стандарт был в основном стабильным. Чтобы гарантировать, что существующая кодовая база не станет устаревшей, стандарт C89/90 не требовал указания типа возвращаемого значения в определениях функций и позволял неявно объявлять функции, если тип возвращаемого значения был int. C99 устранил эту слабость. K&R 2nd Edition показывает свой возраст в таких вопросах.   -  person Jonathan Leffler    schedule 30.01.2019


Ответы (2)


В то время, когда Керниган и Ритчи писали, int был типом по умолчанию. Вычисления в целом были проще, чем сегодня, и имели более ограниченные ресурсы. Языки были созданы для удовлетворения простых потребностей. И они не были полностью спроектированы; они развивались с нуля, с изменениями, внесенными разными людьми в разных местах с разными целями. Таким образом, C в то время не был разработан с учетом современных представлений о безопасности типов или строгости в отношении грамматики, чтобы уменьшить частоту ошибок. Некоторые функции, добавленные в него, были вещами, которые люди считали приятными и сразу же полезными, не обязательно вещами, которые были проанализированы на предмет их более глубоких эффектов или будущих эффектов.

Одним из мотивирующих факторов в языковом дизайне была краткость. int был часто используемым типом, потому что он должен был быть «естественным» типом для любой используемой машины, поэтому было удобно сделать его типом по умолчанию. Поэтому во многих объявлениях по умолчанию использовалось значение int, так что это не требовалось.

Современные компиляторы могут по-прежнему допускать отсутствие int, так что старый код все еще может быть скомпилирован. Часто у таких компиляторов есть переключатели, чтобы более строго определять, какой диалект (диалекты) языка они принимают. Например, в GCC и Clang вы можете указать -std=c11, чтобы запросить более строгое соответствие стандарту C. (И -std=c17 или -std=c18 скоро могут быть доступны.) При написании новых программ вы должны использовать такие переключатели, чтобы ваш компилятор выдавал диагностику кода, не соответствующего современным стандартам. Это поможет написать код, который лучше соответствует текущему стандарту, имеет более четко определенное поведение и с большей вероятностью останется полезным в будущем.

person Eric Postpischil    schedule 30.01.2019

Ага. Сдуйте пыль с вашей белой книги, и вы увидите именно это. K&R — это то, что есть, и это произошло задолго до появления ANSI C.

Еще одно отличие — аргументы функции. Если я правильно помню, это было сделано так

some_function_name(a,b)
int a;
long float b;
{
    printf("%d %lf\n", a, b);
}

C и C++ сильно видоизменились за десятилетия.

person EvilTeach    schedule 30.01.2019
comment
ANSI C89 по-прежнему позволяет опускать возвращаемый тип (C99 сделал это обязательным) - person M.M; 30.01.2019
comment
long float не разрешено (long double разрешено) - person M.M; 30.01.2019
comment
ANSI C появился после K&R, как и изменения в C++. Вещи в будущем не могут влиять на вещи в прошлом, и поэтому это не отвечает на вопрос «Почему Керниган и Ритчи не включают int для основных функций?» - person Eric Postpischil; 30.01.2019
comment
Второе издание книги @Eric Postpischil K&R в моем экземпляре озаглавлено ANSI C, выделенное красными чернилами. Какую книгу я использовал, я никогда не смотрел на книгу первого издания. Как указано ниже, int был типом по умолчанию для того, что возвращает fcn, если вы не включаете возвращаемый тип. Тем не менее, они рекомендуют всегда использовать тип возвращаемого значения или Void, если тип возвращаемого значения отсутствует. Единственное место в книге, где не указан возвращаемый тип, это main. У них много main(){ в книге. По умолчанию он автоматически принимает значение int. - person Manny_Mar; 30.01.2019
comment
@EvilTeach Хотя первая книга C 1978 года объявила fcn, как вы только что показали выше. Вторая книга 1988 года ANSI C объявляет функции так же, как мы это делаем сейчас. - person Manny_Mar; 30.01.2019
comment
@MM long float в те дни был двойным. - person EvilTeach; 30.01.2019
comment
@EvilTeach хорошо, long float не разрешено в C89 и не разрешено K&R2 (стр. 36). У меня нет под рукой копии K&R1, она отличается? - person M.M; 31.01.2019
comment
да, он называет double синонимом long float. - person EvilTeach; 31.01.2019