Подтвердить что ты не робот

Какая версия 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, и если да, то на что я должен смотреть?

4b9b3361

Ответ 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. Важно, однако, чтобы любое программирование на этом языке было ясным, что они используют этот язык, а не сокращающееся подмножество, которое способствует повышению скорости над надежностью.