Каждый выполненный пример завершается с помощью main без «int». Почему это и почему он все равно компилируется без него. Созданы ли компиляторы C с int?
Почему Керниган и Ритчи не используют int для основных функций?
Ответы (2)
В то время, когда Керниган и Ритчи писали, int
был типом по умолчанию. Вычисления в целом были проще, чем сегодня, и имели более ограниченные ресурсы. Языки были созданы для удовлетворения простых потребностей. И они не были полностью спроектированы; они развивались с нуля, с изменениями, внесенными разными людьми в разных местах с разными целями. Таким образом, C в то время не был разработан с учетом современных представлений о безопасности типов или строгости в отношении грамматики, чтобы уменьшить частоту ошибок. Некоторые функции, добавленные в него, были вещами, которые люди считали приятными и сразу же полезными, не обязательно вещами, которые были проанализированы на предмет их более глубоких эффектов или будущих эффектов.
Одним из мотивирующих факторов в языковом дизайне была краткость. int
был часто используемым типом, потому что он должен был быть «естественным» типом для любой используемой машины, поэтому было удобно сделать его типом по умолчанию. Поэтому во многих объявлениях по умолчанию использовалось значение int
, так что это не требовалось.
Современные компиляторы могут по-прежнему допускать отсутствие int
, так что старый код все еще может быть скомпилирован. Часто у таких компиляторов есть переключатели, чтобы более строго определять, какой диалект (диалекты) языка они принимают. Например, в GCC и Clang вы можете указать -std=c11
, чтобы запросить более строгое соответствие стандарту C. (И -std=c17
или -std=c18
скоро могут быть доступны.) При написании новых программ вы должны использовать такие переключатели, чтобы ваш компилятор выдавал диагностику кода, не соответствующего современным стандартам. Это поможет написать код, который лучше соответствует текущему стандарту, имеет более четко определенное поведение и с большей вероятностью останется полезным в будущем.
Ага. Сдуйте пыль с вашей белой книги, и вы увидите именно это. K&R — это то, что есть, и это произошло задолго до появления ANSI C.
Еще одно отличие — аргументы функции. Если я правильно помню, это было сделано так
some_function_name(a,b)
int a;
long float b;
{
printf("%d %lf\n", a, b);
}
C и C++ сильно видоизменились за десятилетия.
long float
не разрешено (long double
разрешено)
- person M.M; 30.01.2019
main(){
в книге. По умолчанию он автоматически принимает значение int.
- person Manny_Mar; 30.01.2019
long float
не разрешено в C89 и не разрешено K&R2 (стр. 36). У меня нет под рукой копии K&R1, она отличается?
- person M.M; 31.01.2019
int
. C99 устранил эту слабость. K&R 2nd Edition показывает свой возраст в таких вопросах. - person Jonathan Leffler   schedule 30.01.2019