Какая версия C больше подходит для обучения студентов - C89 / 90 или C99? - PullRequest
19 голосов
/ 05 декабря 2010

Я изучаю основы и синтаксис C, прежде чем начать системное программирование в следующем месяце. Читая, я наткнулся на стандарты C89 / 99. Согласно Википедии,

C99 представил несколько новых функций, включая встроенные функции, несколько новые типы данных (в том числе long long Int и сложный тип для представления комплексные числа), переменной длины массивы, поддержка вариадических макросов (макросы переменной арности) и поддержка для однострочных комментариев, начинающихся с // как в BCPL или C ++. Многие из них уже был реализован как расширения в нескольких компиляторах Си.

C99 по большей части отсталый совместим с С90, но строже в какой-то степени; в частности, объявление, в котором отсутствует тип спецификатор больше не имеет int неявно предполагается. Стандартный макрос STDC_VERSION определяется значением 199901L, чтобы указать, что поддержка C99 доступен. GCC, Sun Studio и другие компиляторы теперь поддерживают много или все новые функции C99.

Я позаимствовал копию K & R, 2nd Edition, и она использует стандарт C89. Для студента, делает ли использование C89 недействительным некоторые предметы, охватываемые K & R, и если да, то на что мне обратить внимание?

Ответы [ 8 ]

19 голосов
/ 05 декабря 2010

Нет смысла изучать C89 или C90 по сравнению с C99 - это было буквально заменено.Легко найти компиляторы C99, и нет никаких причин изучать более ранние стандарты.

Это не значит, что ваш профессор не навязывает вам C89.Из различных вопросов, обозначенных здесь как «домашнее задание», я чувствую, что многие, многие курсы C (и, к сожалению, C ++) не двигались с C89.

С точки зрения начинающего ученика, шансыв том, что вы на самом деле не заметите разницы - есть много C, который подходит как для C99, так и для C89 / 90.

11 голосов
/ 05 декабря 2010

Используйте стандарт C99, он более новый и имеет больше функций.Особенно полезными могут быть типы bool в <stdbool.h> и семейство типов int32_t и т. Д .;последний предотвращает большое количество непереносимого кода, который зависит от int s, имеющего определенный размер.На самом деле, это не делает K & R недействительным, хотя некоторые примеры программ могут быть написаны в несколько ином стиле.

Обратите внимание, что некоторые компиляторы все еще не поддерживают C99 должным образом.Я считаю, что GCC все еще требует использования флага -std=c99 для его включения;многие системы Unix / Linux имеют команду c99, которая оборачивает GCC и включает C99.

То же самое касается многих профессоров университетов.Я удивил себя тем, что сдал программу, которая использовала bool на первом курсе.Он никогда не слышал о таком типе в C:)

4 голосов
/ 05 декабря 2010

Хотя я в целом согласен с остальными, стоит отметить, что K & R - такая хорошая книга, что, возможно, стоит почерпнуть у нее C и затем обновить свои знания, когда вы читаете о стандарте C99.

3 голосов
/ 05 декабря 2010

Если вы на уровне ученика, вы, вероятно, даже не заметите различий.

2 голосов
/ 05 декабря 2010

Да, немного странно, что вы можете получить громкое согласие с тем, что 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 обычно говорит вам о том, как и когда вы попытаетесь их использовать.

1 голос
/ 05 декабря 2010

Хотя я думаю, что полезно знать, какие функции более поздние и менее вероятно будут поддерживаться неясными (или преднамеренно испорченными, как 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; или других отвратительных устаревших хаков для работы с 64-битными числами.Любой здравомыслящий компилятор, даже без поддержки C99, имеет свои собственные 64-битные типы, которые вы можете использовать для определения int64_t и uint64_t.

1 голос
/ 05 декабря 2010

Как студент, это не так сильно на тебя влияет. Но если возможно, вы должны найти новую книгу C, которая охватывает C99

0 голосов
/ 15 марта 2011

Термин «C89» описывает два очень разных языка:

  1. Язык, который, по мнению программистов в 1989 году, Комитет описывал в местах, где стандарт был неоднозначным, и который поддерживал функции, которые были распространены в ранее существующих реализациях.

  2. Язык, который Комитет с тех пор решил, что он хотел описать, что исключает совместимость с существующими функциями окно.

C99 «проясняет» неоднозначные части стандарта, говоря, что они имели в виду интерпретировать стандарт таким образом, чтобы это часть существующего кода и сделал невозможным выполнение многих задач эффективно, как они были выполнены в C до 1989 года.

Подходящим языком для программирования для многих приложений будет расширенный набор предстандартных C, C89, C99 и C11. Однако важно, чтобы любой программист на этом языке четко понимал, что использует этот язык, а не сокращающееся подмножество, которое предпочитает скорость над надежностью.

...