Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Название:Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Автор:
- Жанр:
- Издательство:Вильямс
- Год:0101
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015 краткое содержание
Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Перечисления
Язык C++ строже С в отношении применения перечислений. В частности, практически единственное, что можно делать с переменной enum — это присваивать ей константу enum и сравнивать ее с другими значениями. Нельзя присваивать значения int nеременной enum без явного приведения типа, равно как не допускается инкрементировать переменную enum. Следующий код иллюстрирует эти утверждения:
enum sample {sage, thyme, salt, pepper}; enum sample season;
season = sage; /* допустимо в С, C++ */
season = 2; /* предупреждение в С, ошибка в C++ */
season = (enum sample) 3; /* допустимо в С, C++ */
season++; /* допустимо в С, ошибка в C++ */
Справочные материалы 915
Кроме того, C++ позволяет не указывать ключевое слово enum при объявлении переменной:
enum sample {sage, thyme, salt, pepper};
sample season; /* недопустимо в С, допустимо в C++ */
Как в случае со структурами и объединениями, это может привести к конфликтам, если имена переменной и типа enum совпадают.
Указатель на void
В языке C++, как и в С, указателю на void можно присвоить указатель любого типа, но в отличие от С, указатель на void нельзя присваивать указателю другого типа без явного приведения. Сказанное демонстрируется в следующем коде:
int ar[5] = {4, 5, 6,7, 8}; int * pi; void * pv;
pv = ar; /* допустимо в С, C++ */
pi = pv; /* допустимо в С, недопустимо в C++ */
pi = (int * ) pv; /* допустимо в С, C++ */
Еще одно отличие C++ заключается в том, что вы можете присваивать адрес объ
екта производного класса указателю на базовый класс, но это относится к возможностям, которые в С отсутствуют.
Булевские типы
В языке C++ булевский тип называется bool, a true и false являются ключевыми словами. В языке С булевский тип имеет название Bool, но включение заголовочного файла stdbool.h делает доступными bool, true и false.
Альтернативное написание
В C++ альтернативное написание or для || и прочих операций обеспечивается ключевыми словами. В С99 и С11 альтернативные написания определены в виде макросов, и для того, чтобы сделать их доступными, необходимо включить заголовочный файл iso64 6.li.
Поддержка широких символов
В C++ тип wchar t является встроенным, a wchar t — ключевым словом. В С99 и C11 тип wchar t определен в нескольких заголовочных файлах (stddef.h, stdlib.h, wchar.h, wctype.h). Подобным же образом, charl6_t и char32_t — это ключевые слова в С++11, но макросы, определенные в uchar.li, в СИ.
Язык C++ предоставляет поддержку ввода-вывода широких символов (wchar t, charl6_t и char32_t) через заголовочный файл iostream, тогда как С99 предлагает совершенно другой пакет поддержки ввода-вывода, доступный через заголовочный файл wchar.h.
Комплексные типы
Язык C++ поддерживает комплексные типы посредством класса complex, предоставляемого с помощью заголовочного файла complex. Язык С имеет встроенные комплексные типы и поддерживает их через заголовочный файл complex.h. Эти два подхода существенно отличаются и несовместимы друг с другом. Версия С в большей степени отражает практические потребности вычислительного сообщества.
916 Приложение Б
Встраиваемые функции
В стандарте С99 была добавлена поддержка встраиваемых функций — средства, которое давно существовало в языке C++. Однако их реализация в С99 является более гибкой. В C++ встраиваемая функция по умолчанию имеет внутреннее связывание. Если встраиваемая функция C++ появляется в более чем одном файле, то она должна иметь одно и то же определение, используя те же самые лексемы. Например, один файл не может иметь определение с параметром типа int, а другой — определение с параметром типа int32_t, несмотря на то, что int32_t — это typedef для int. Гем не менее, в С такая организация разрешена. Кроме того, как было описано в главе 15, язык С позволяет смешивать встраиваемые и внешние определения, что в C++ не допускается.
Средства С99/С11, которых нет в С++11
Хотя традиционно считается, что язык С в большей или меньшей степени является подмножеством C++, в стандарте С99 появились некоторые средства, отсутствующие в C++. Ниже перечислены наиболее заметные из них:
• назначенные инициализаторы;
• составные инициализаторы;
• ограниченные указатели;
• массивы переменной длины;
• гибкие элементы массивов;
• макросы с переменным количеством аргументов.
На заметку!
Приведенный список — это просто моментальный снимок на конкретный момент, и перечни разделяемых и неразделяемых возможностей продолжат видоизменяться. Например, в
С++14 добавится средство, подобное массивам переменной длины С99.
В
Набор символов
ASCII
918 Приложение В
С
имволы сохраняются в памяти компьютеров с использованием числовых кодов.
В США наиболее часто применяется кодировка ASCII (American Standard Code for Information Interchange — американский стандартный код для обмена информацией). Язык С позволяет представить большинство одиночных символов напрямую путем заключения символа в одинарные кавычки, например, 'А' для символа A. Кроме того, одиночный символ можно представить с использованием его восьмеричного или шестнадцатеричного кода, перед которым должна находиться обратная косая черта, например, ‘\012 ' и '\0ха' соответствуют символу перевода строки (LF). Управляющие последовательности подобного рода также могут быть частью строки, скажем, такой: "Добро пожаловать, \012уважаемый".
В представленной ниже таблице символ Л, применяемый как префикс, обозначает клавишу .
Набор символов ASCII 919
920 Приложение В
Набор символов ASCII 921
Предметный указатель
Предметный указатель 923
924 Предметный указатель
Предметный указатель 925
926 предметный указатель
Факториал, 344
Флаг, 261
Функция, 40; 326; 384 assert(), 704 atexit(), 698 calloc(), 514 exit(), 698 fclose(), 540 feof(), 553 ferror(), 553 fflush(), 550 fgetpos(), 548 fgets(), 432; 544 fopen(), 537 fprintf(), 542 fputs(), 432; 441; 544 fread(), 551; 553 free(), 513 fscanf(), 542 fseek(), 544 fsetpos(), 548 ftell(), 544
fwrite(), 551; 552; 553 getc(), 538 get_choice(), 318 gets(), 430; 432 gets_s(), 436 itobs(), 640 main(), 56 memcpyO, 707 memmove(), 707 mycompO, 702 printf(), 442 putc(), 538 puts(), 440 qsort(), 700; 702 rand0.c, 502 scanf(), 438 setvbuf(), 550 s_gets(), 437 sprintf(), 459 strcat(), 446 strcmpO, 449; 452; 454 strcpy(), 454; 456 strlen(), 445 strncat(), 447 strncpyO, 454; 458 ungetc(), 549 ввода-вывода, 129
Читать дальшеИнтервал:
Закладка: