Лекция-02.ppt
- Количество слайдов: 24
Рейтинг языков программирования (www. tiobe. com/index. php/content/paperinfo/tpci/index. html ) Лекция 09. 13 г. 1
Язык программирования С Лекция 09. 13 г. 2
Общие сведения Язык C был создан в 1972 г. Дэннисом Ритчи, который работал в компании Bell Telephone Laboratories. Родословная языка С берет свое начало от языка Алгол и включает в себя Паскаль и ПЛ/1. C был разработан как язык для программирования в новой по тем временам операционной системе Unix. ОС Unix была написана на языке ассемблера для ЭВМ PDP-7 и перенесена затем на PDP-11. На язык C оказал значительное влияние его предшественник, язык В, созданный Кэном Томпсоном, а язык В, в свою очередь, является последователем языка BCPL. Язык ВСРL (Basic Combined Programming Language) был создан в 1969 г. Мартином Ричардсом в рамках проекта "Комбинированный язык программирования" в Кэмбриджском университете в Лондоне. Вскоре Unix была переписана на языке C, и в 1974 - 75 гг. OC Unix фирмы Bell Laboratories стала первым коммерческим продуктом, реализующим идею о том, что операционная система может быть успешно написана на языке высокого уровня, если этот язык является достаточно мощным и гибким. Лекция 09. 13 г. 3
Краткая характеристика языка С Ø Популярный компактный язык общего назначения; изначально создавался как язык системного программирования (для ОС UNIX) Ø «Низкоуровневый» язык, типы данных и управляющие структуры которого близки архитектуре большинства компьютеров Ø Примечательные особенности языка С: • адресная арифметика с использованием указателей • чрезвычайно широкий набор операций • все функции используют передачу аргументов по значению • простая двухуровневая структура областей видимости • отсутствуют средства ввода/вывода и управления памятью (они обеспечиваются подпрограммами из библиотеки) • гибкая структуры типов Лекция 09. 13 г. 4
Деннис Ритчи (Dennis Mac. Alistair Ritchie) [09. 1941, Mount Vernon, New York (USA)] • Разработчик (совместно с Брайаном Керниганом) языка программирования С [1972] • Разработчик (совместно с Кеном Томпсоном) операционной системы UNIX [1969 -73]. Б. Кергниган, Д. Ритчи Язык программирования С. — М. : «Вильямс» , 2011. — 304 с. Лекция 09. 13 г. 5
Брайан Керниган (Brian Wilson Kernighan) [January 1942, Toronto] • Разработчик (совместно с Денисом Ритчи ) языка программирования С [1972] Лекция 09. 13 г. 6
Кеннет Томпсон Кен Томпсон (англ. Kenneth Thompson; род. 4 февраля 1943) — пионер компьютерной науки, известен за свой вклад в создание языка программирования C и операционной системы UNIX Лекция 09. 13 г. 7
Стандартизация языка С Первый стандарт языка C был опубликован американским институтом ANSI. Через некоторое время он был принят международной организацией по стандартизации ISO, продолжившей выпускать следующие версии стандарта, которые стали приниматься как стандарт и институтом ANSI. Несмотря на это стандарт до сих пор чаще называют ANSI C, а не ISO C. C 89 В 1983 году Американский национальный институт стандартов сформировал комитет X 3 J 11 для создания спецификации стандарта C. В 1989 году, после длительного и напряжённого процесса, стандарт был завершён и утверждён как ANSI X 3. 159 -1989 «Язык программирования C» . Именно эту версию часто называют «ANSI C» , или «C 89» (чтобы отличить её от C 99). C 90 В 1990 году, стандарт ANSI C (с небольшими изменениями) был принят Международной организацией по стандартизации (ISO) как ISO/IEC 9899: 1990. Эту версию иногда называют C 90. Однако, термины C 89 и C 90 относятся в сущности к одному языку. C 99 В марте 2000 года ANSI принял стандарт ISO/IEC 9899: 1999. Этот стандарт обычно называют C 99. Это и есть современный стандарт языка программирования C, однако его не поддерживает полностью ни один компилятор. C 11 В декабре 2011 г. ISO опубликовала новый международный стандарт языка программирования C: ISO/IEC 9899: 2011, ранее известный как C 1 X. Лекция 09. 13 г. 8
Стандартизация языка С Опубликован новый стандарт языка C: C 11 Международная организация по стандартизации (ISO) опубликовала новый международный стандарт языка программирования C: ISO/IEC 9899: 2011, ранее известный как C 1 X. Основные изменения: • поддержка многопоточности; • улучшенная поддержка юникода; • обобщенные макросы (type-generic expressions, позволяют статичную перегрузку); • анонимные структуры и объединения (упрощают обращение ко вложенным конструкциям); • управление выравниванием объектов; • статичные утверждения (static assertions); • удаление опасной функции gets (в пользу безопасной gets_s); • функция quick_exit; • спецификатор функции _Noreturn; • новый режим эксклюзивного открытия файла. Кроме того, определен ряд необязательных для реализации возможностей, включая новый набор безопасных функций (в т. ч. для работы с массивами с проверкой границ). В этот список также попали возможности, которые в предыдущем стандарте считались обязательными: комплексная арифметика, массивы переменной длины. Некоторые возможности нового стандарта уже поддерживаются компиляторами GCC и Clang. Стоит, однако, отметить, что полной поддержки предыдущего стандарта C 99 в этих и большинстве других компиляторов нет. Лекция 09. 13 г. 9
Эволюция языка С BCPL → B → C → K&R C → ANSI C → C 99 → C 11 ≈1960 ≈1972 ≈1978 ≈1988 ≈1999 2011 Лекция 09. 13 г. 10
Последний стандарт языка С Лекция 09. 13 г. 11
Компактность языка С Лекция 09. 13 г. 12
Пример программы на С – «Калькулятор» #include <stdio. h> 1 #include <stdlib. h> #define PROMPT ': ' 2 int main(){ 3 float a, b, result; 4 char opr; 5 while(putchar(PROMPT), scanf("%f%c%f", &a, &opr, &b) != EOF){ switch(opr){ 6 case '+': result = a + b; break; case '-': result = a - b; break; 7 case '*': result = a * b; break; case '/': result = a / b; break; default: 8 printf("ERROR **** wrong sign of the operationn"); 9 exit(EXIT_FAILURE); 10 } printf("Result = %gn", result); } exit(EXIT_SUCCESS); } Лекция 09. 13 г. 13
Последовательность изучения языка С Типы данных, операции и выражения Управляющие конструкции (поток управления) Функции и структура программы Указатели и массивы Структуры Ввод и вывод Препроцессор Стандартная библиотека Обзор расширений языка в новых стандартах Лекция 09. 13 г. 14
Переменные, константы и типы данных Фундаментальные объекты данных, с которыми работает программа – это переменные и константы. Переменная имеет имя, тип и текущее значение. Имя для переменной выбирается программистом произвольно с учетом следующих ограничений: -имя должно начинаться с буквы и может состоять из букв и цифр; знак «подчеркивание» считается буквой; -буквы в верхнем и нижнем регистре различаются; -в качестве имен не разрешается использовать зарезервированные слова языка (for, while, int и т. п. ); -длина имени не может быть более 31 символа для внутренних переменных и более 6 символов для внешних переменных. Замечание. Кроме имен переменных в программах могут использоваться символические имена (символические константы), которые определяются с помощью директивы препроцессора #define и задают правило подстановки: #define имя текст_для_подстановки Например: #define STEP 20 Лекция 09. 13 г. 15
Типы данных Каждая переменная относится к определенному типу данных. Такая принадлежность устанавливается при объявлении переменной: int k; Все переменные одного типа данных имеют одинаковый размер, одинаковое «внутреннее устройство» и одинаковый набор операций, которые можно к ним применить. В языке С определены 4 базовых типа данных: char - один байт, содержащий один символ, int - целое число стандартной длины (для данной системы), float - вещественное число одинарной точности с плавающей точкой, double - вещественное число двойной точности с плавающей точкой. Кроме того, имеется 4 модификатора: short - «короткий» : short int, long - «длинный» : long int, long double, signed - «со знаком» , т. е. величина имеет знаковый разряд, unsigned - «без знака» , т. е. величина не имеет знакового разряда. Лекция 09. 13 г. 16
Представление чисел. Системы счисления Система счисления — это символический метод записи чисел, позволяющий представить числа с помощью письменных знаков (цифр). Наибольшее распространение получили позиционные системы счисления (ПСС), в которых положение цифры в записи числа однозначно определяет то количество, которое представляет эта цифра, например: 274 = 2*102+7*101+4*100=200+70+4 Важнейшими характеристиками любой ПСС являются: • основание системы счисления и • набор цифр, используемых для записи чисел. Так, основанием десятичной СС является 10, а набором цифр – множество {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}. Для компьютеров используется двоичная СС с основанием 2 и цифрами 0 и 1. Пример числа в двоичной СС: 10102 = 1*23+0*22+1*21+0*20=8+2=10 Также распространены восьмеричная СС (осн. =8, цифры={0, 1, 2, 3, 4, 5, 6, 7}) и шестнадцатеричная СС (осн. =16, цифры={0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f}). Примеры: 3758 = 3*82+7*81+5*80 = 3*64+7*8+5 = 192+56+5 = 25310 1 f 7 a 16 = 1*163+15*162+7*161+10*160 = 1*4096+15*256+7*16+10 = 4096+3840+112+16 = 805810 Лекция 09. 13 г. 17
Биты, байты и машинные слова В современных компьютерах любая информация представляется комбинацией 0 и 1. Поэтому наименьшей порцией данных является 1 бит, способный хранить либо 0, либо 1. На практике наряду с битами используют боле крупные единицы – байты и машинные слова. Размер 1 байта = 8 битов, а размер машинного слова зависит от архитектуры компьютера. Для 32 -разрядной архитектуры 1 машинное слово = 32 бита, или 4 байта. Изображать значения, хранящиеся в байтах и машинных словах, в двоичном коде громоздко, поэтому используют восьмеричную или шестнадцатеричную запись, например: 101010112 = 2538 = ab 16 = 17110 В языке С допускается записывать целые числа в десятичной, восьмеричной и шестнадцатеричной системах счисления: • Десятичная запись – обычная (но первой цифрой не может быть 0) • Восьмеричная запись – начинается с 0, например: 0253 • Шестнадцатеричная запись – начинается с 0 x, например: 0 xab Лекция 09. 13 г. 18
Беззнаковые числа и числа со знаком В языке С допускается использовать целые числа без знака (они всегда ≥ 0) или числа со знаком (положительные и отрицательные). Для беззнаковых чисел все разряды (биты) используются для представления величины числа. Например, если все биты у байта =1, то мы имеем: 0 xff = 255. Для чисел со знаком правила более сложные. У положительных чисел старший бит (крайний левый) всегда =0, а остальные биты выражают само число, например: 0 x 7 f = 127 и это будет максимальное положительное число, которое можно записать в 1 байт. Отрицательные числа записываются в так называемом дополнительном коде и у них всегда старший бит будет =1. Чтобы получить число в дополнительном коде, нужно взять сначала соответствующее положительное число, а затем применить к нему 2 операции: • Инвертировать двоичную запись этого числа (единицы заменить нулями, а нули – единицами) • Добавить к полученному коду 1 (сложение выполнять по правилам двоичной арифметики) Пример: 116 = 0 x 74 = 01110100; -116 = 10001011 + 1 = 10001100 = 0 x 8 c Замечание: 116 + (– 116) = 0 x 74 + 0 x 8 c = 0 Лекция 09. 13 г. 19
Пример Пусть для компьютера с 32 -разрядной архитектурой текущее значение некоторой переменной таково: 1 1 1 … … 1 1 1 32 или в формате шестнадцатеричной константы: 0 xffff Тогда, если считать эти байты значением переменной типа signed int, будем иметь значение -1. Если же в этой области памяти хранится переменная типа unsigned int, её значением будет 232 -1 = 4 294 967 295. Другой пример: 1 0 0 … … 0 32 0 0 или в формате шестнадцатеричной константы: 0 x 80000000 Для переменной типа signed int имеем значение -2 147 483 648. А для переменной типа unsigned int: 231 = 2 147 483 648. Лекция 09. 13 г. 20
Иллюстрация к примеру #include <stdio. h> int main() { printf("0 xffffffff printf("0 x 80000000 getchar(); return 0; } (signed) = (unsigned) %d n", 0 xffff ); = %u n", 0 xffff ); %d n", 0 x 80000000 ); = %u n", 0 x 80000000 ); Лекция 09. 13 г. 21
Числовые константы Константы, в отличие от переменных, не имеют имён. Запись константы в виде цепочки символов одновременно является и значением этой константы. Для каждого типа данных существуют свои правила записи констант. Целочисленные константы записывают, как правило, с помощью десятичных цифр, хотя возможна их запись в восьмеричной и шестнадцатеричной системах: 123, 67543, 037, 07777, 0 xabf 7, 0 XFFFF, … Допускается использование суффиксов l или L (long), а также u или U (unsigned): 123456789 L, 0 XFUL (это просто число 15). Вещественные константы содержат десятичную точку, а также степенную часть (экспоненту) или и то, и другое: 1234. 5, 1 e-2, 12. 3 E 1, … Такие константы имеют тип double, однако имеется возможность записи констант float и long double : 1. 2 f, 23. 45 F, 1 e-1 L, … Лекция 09. 13 г. 22
Определение символических констант в limits. h #define CHAR_BIT 8 #define #define SCHAR_MIN (-128) SCHAR_MAX 127 UCHAR_MAX 255 CHAR_MIN SCHAR_MIN CHAR_MAX SCHAR_MAX #define INT_MAX 2147483647 #define INT_MIN (-INT_MAX-1) #define UINT_MAX 0 xffff #define SHRT_MAX 32767 #define SHRT_MIN (-SHRT_MAX-1) #define USHRT_MAX 0 xffff #include <stdio. h> #include <limits. h> int main() { printf("INT_MAX = %d n", INT_MAX); printf("UINT_MAX = %u n", UINT_MAX); printf("SHRT_MAX = %d n", SHRT_MAX); printf("USHRT_MAX = %u n", USHRT_MAX); printf("LONG_MAX = %ld n", LONG_MAX); printf("ULONG_MAX = %lu n", ULONG_MAX); getchar(); return 0; } #define LONG_MAX 2147483647 L #define LONG_MIN (-LONG_MAX-1) #define ULONG_MAX 0 xffff. UL Лекция 09. 13 г. 23
Символьные константы Символьная константа – это целое число, записываемое в форме одиночного символа в одинарных кавычках: ‘x’, ‘ 0’ и т. п. Значением символьной константы является числовое значение кода символа. Например, значением константы ‘ 0’ является число 48. Символьные константы могут участвовать в арифметических операциях. Для записи «неграфических» символов используют управляющие последовательности: a – подача звукового сигнала, b – возврат назад и затирание f – прогон страницы, n – конец строки r – возврат каретки, t – горизонтальная табуляция v – вертикальная табуляция, \ - обратная косая черта ? – вопросительный знак, ’ – одинарная кавычка ” – двойная кавычка 00 – восьмеричное число xhh – шестнадцатеричное число – нулевой байт Лекция 09. 13 г. 24
Лекция-02.ppt