Какая версия C более подходит для изучения учащимися - C89/90 или C99?
Я изучаю основы и синтаксис C перед началом программирования систем в следующем месяце. При чтении я столкнулся со стандартами C89/99. Согласно Википедии,
C99 представила несколько новых функций, включая встроенные функции, несколько новые типы данных (в том числе длинные int и сложный тип для представления комплексные числа), переменной длины массивы, поддержка переменных массивов (макросы переменной arity) и поддержка для однострочных комментариев, начинающихся с //, как в BCPL или С++. Многие из этих уже были реализованы как расширений в нескольких компиляторах C.
C99 по большей части отстает совместим с C90, но является более строгим В неком роде; в частности, объявление, в котором отсутствует тип спецификатор больше не имеет int неявно предполагается. Стандартный макрос STDC_VERSION определяется значением 199901L, чтобы указать, что поддержка C99 доступен. GCC, Sun Studio и другие компиляторы теперь поддерживают многие или все новые функции C99.
Я заимствовал копию K & R, 2nd Edition и использовал стандарт C89. Для ученика использование C89 недействительно некоторых предметов, охваченных K & R, и если да, то на что я должен смотреть?
Ответы
Ответ 1
Нет причин учиться C89 или C90 над C99 - он был буквально заменен. Легко найти компиляторы C99, и нет никаких оснований для изучения более раннего стандарта.
Это не означает, что ваш профессор не будет принуждать вас к C89. Из различных вопросов, размещенных здесь, отмечены домашние задания, у меня возникает ощущение, что многие, многие курсы C (и, к сожалению, С++) не перешли с C89.
С точки зрения начинающего ученика, есть вероятность, что вы на самом деле не заметите разницы - там будет много C, которые будут покрыты как C99, так и C89/90.
Ответ 2
Используйте стандарт C99, он новее и имеет больше возможностей. Особенно полезным может быть тип bool
в <stdbool.h>
и int32_t
и т.д. Семейства типов; последний предотвращает много неуправляемого кода, который полагается на int
, имеющий определенный размер. AFAIK, это не делает недействительными K & R, хотя некоторые примеры программ могут быть написаны в несколько другом стиле.
Обратите внимание, что некоторые компиляторы по-прежнему не поддерживают C99 должным образом. Я считаю, что GCC по-прежнему требует использования флага -std=c99
для его включения; многие системы Unix/Linux имеют команду c99
, которая обертывает GCC и включает C99.
То же самое касается многих университетских профессоров. Я удивил мою, передав программу, которая использовала bool
в первый год обучения. Он никогда не слышал об этом типе в C:)
Ответ 3
Хотя я в целом согласен с другими, стоит отметить, что K & R - такая хорошая книга, что, возможно, стоит изучить C, а затем обновить свои знания, когда вы читаете о стандарте C99.
Ответ 4
Если вы находитесь на уровне ученика, вы, вероятно, даже не заметите различий.
Ответ 5
Да, немного странно, что вы можете получить громкое согласие, что K & R - отличная книга C, а также громкое согласие, что C99 является правильной/текущей/лучшей версией C. Две позиции несовместимы - даже если K & R - лучшая книга, доступная для изучения "C-значения C99", это просто означает, что остальные являются мусором или также безнадежно устарели.
Я бы посоветовал учиться и использовать C99, но слежу за C89, когда вы это делаете. Если вы используете компилятор с режимом C89 и C99, то вы можете написать несколько бит C89, чтобы получить представление о различиях. Затем, если вам когда-нибудь понадобится написать какой-то код, предназначенный для переносимости на места, которые не спускаются на C99, вы будете знать, что делать. Если вам никогда не приходилось писать какой-либо такой код, вы потеряли, возможно, день.
Написание C89 правильно на самом деле удивительно сложно, потому что получить копию стандарта C89 сложно. Итак, C99, если можно, C89, если по какой-то нечетной причине вам нужно, и у вас есть понимание, в чем разница. Возможно, используйте K & R, чтобы охватить самые основы, но посмотрите как можно скорее на некоторый идиоматический C99.
Что касается конкретных проблем, которые необходимо учитывать при чтении K & R: есть список основных изменений в предисловии стандарта (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf), хотя детали не указаны. Многие из них являются новыми функциями, добавленными на C99, поэтому не так, что K & R ошибочен, он может не всегда использовать лучшие инструменты для данного задания. Некоторые из них довольно нерешительные вещи, где вам, вероятно, следует проконсультироваться со стандартом, если вам все равно нужны детали. Остальные - это вещи, удаленные из C89, которые обычно компилятор C99 расскажет вам о том, когда и когда вы попытаетесь их использовать.
Ответ 6
Как студент, это не так сильно влияет на вас. Но если это возможно, вы должны найти новую C-книгу, которая охватывает C99
Ответ 7
Хотя я думаю, что было бы полезно узнать, какие функции более поздние и менее вероятно будут поддерживаться неясными (или преднамеренно испорченными, например, MSVC) компиляторами, есть несколько функций C99, которые вы должны обязательно использовать:
-
snprintf
: это определенная функция для безопасной и чистой сборки строк в C. Если ваш компилятор отсутствует, вы можете либо заменить всю подсистему printf
(вероятно, это хорошая идея, так как большинство реализаций с отсутствующим snprintf
также заполнены (часто преднамеренно) ошибки в поведении printf
), или оберните tmpfile
/fprintf
/fread
/fclose
.
-
stdint.h
: если вам нужны типы фиксированного размера (16/32/64-битные), используйте стандартные имена int16_t
, uint16_t
, int32_t
и т.д. Не изобретайте свои собственные и абсолютно не используйте системные, такие как INT64
или u32
. Это просто делает ваш код уродливым и сложным для интеграции и повторного использования. Если в вашем компиляторе отсутствует stdint.h
, просто добавьте свой собственный, чтобы определить типы в терминах типов, подходящих для вашей платформы.
-
В частности, uint64_t
вместо int foo[2];
или struct { int lo, int hi; } foo;
struct { int lo, int hi; } foo;
или другие отвратительные устаревшие хаки для работы с 64-битными числами. Любой здравомыслящий компилятор, даже без поддержки C99, имеет свои собственные 64-битные типы, которые вы можете использовать для определения int64_t
и uint64_t
.
Ответ 8
Термин "C89" описывает два очень разных языка:
-
Язык, который программисты в 1989 году считали Комитетом в тех местах, где стандарт был неоднозначным, и который поддерживал функции, которые были распространены в ранее существовавших реализациях.
-
Язык, с которого Комитет с тех пор решил, что он хотел бы описать, который закрепил совместимость с существующей функциональностью
окно.
C99 "разъясняет" неоднозначные части стандарта, говоря, что они имели в виду
чтобы Стандарт интерпретировался таким образом, который нарушил бы существенную
доли существующего кода и не позволили выполнить множество задач как
эффективно, поскольку они были выполнены на C до 1989 года.
Правильный язык для программирования в, для многих приложений, будет надмножеством пред-стандартных C, C89, C99 и C11. Важно, однако, чтобы любое программирование на этом языке было ясным, что они используют этот язык, а не сокращающееся подмножество, которое способствует повышению скорости над надежностью.