Лекции Булатицкий Дмитрий Иванович (во многом по материалам Прасолова А. Н.)
Скачать 319.62 Kb.
|
Идентификаторы языка СиИдентификаторы или имена служат для обозначения различных объектов программ: переменных (ячеек памяти), адресов, функций, файлов и т.д., иначе говоря - данных и действий над данными. Имена должны начинаться с букв латинского алфавита или знака подчеркивания, далее допускается использовать и арабские цифры: БНФ: имя = (буква | "_") { буква | цифра | "_" } буква = "A"|"B"|...|"Y"|"Z"|"a"|"b"|...|"y"|"z" десятичная_цифра = "0"|"1"|...|"9" При этом прописные и строчные буквы считаются разными. Длина имени в ANSI стандарте языка Си не ограничена. В Турбо Си имя не может быть длиннее 32 символов. Например: a, a1, _a, a_b. Выбор имен должен производиться так, чтобы имя как можно точнее соответствовало смыслу объекта или действия, которое оно обозначает. Например: speed_of_body, SpeedOfBody, BodySpeed. Экономия на длине имен - плохой стиль программирования. Понятие о типах данныхТип данных определяет структуру объекта данных, множество его разрешенных значений и множество операций, которые можно над ним выполнять. Объекты различных типов требуют различного количества памяти для их хранения и различных команд процессора для выполнения действий над ними. Классификация типов данныхМожно выделить следующие типы: простые: целые (char, short int, int, long int, также к целым типам применим модификатор unsigned); вещественные (float, double, long double); составные: массивы, структуры, объединения, перечисления; указатели. Основные типы данных языка СиВ языке Си предопределены несколько имен типов: БНФ: предопр_тип = "int" | "short" | "long" | "char" | "float" | "double" |"long double" int - целый длиной 2 байта, диапазон значений -32768 ... +32767; short - целый короткий, для IBM PC аналогичен int; long - целый длиной 4 байта, диапазон значений char - символьный длиной 1 байт, его можно рассматривать как целое -128...+127 (иногда 0...255); float - тип данных с плавающей точкой, длиной 4 байта, вещественное число с диапазоном значений от до и 6-ю значащими цифрами; double - тип данных с плавающей точкой, длиной 8 байт, вещественное число с диапазоном значений от до и 14-ю значащими цифрами; Также язык Си позволяет определять пользовательские типы. БНФ: тип = предопр_тип | польз_тип Вещественный тип данных следует использовать в тех случаях, когда данное в принципе может иметь дробную часть. Например, его надо использовать для описания почти всех физические величин: длины, массы, времени и т.д. Иногда величина, вообще говоря, целая, но большая настолько, что типа данных long не хватает. В этом случае тоже используется вещественный тип данных. Однако необходимо учитывать, что все арифметические действия с вещественными типами выполняются приближенно. Целый тип данных часто используется для организации флагов, счетчиков, индексов и т.д. Обычно целый тип охватывает и отрицательные и положительные значения. Например, тип int имеет диапазон значений от -32768 до 32767. Иногда отрицательные значения не нужны. Тогда имеется возможность вдвое увеличить диапазон положительных значений, т. е. от 0 до 65535. Это можно сделать если описать тип как беззнаковый. БНФ: имя_беззнакового_типа = "unsigned "("int"|"long"|"short"|"char" ) Описание данных в языке СиЯзык Си относится к языку с жестко определенными типами данных: каждое имя всегда обозначает объект некоторого типа, причем этот тип нельзя изменить до конца выполнения программы. Назначение типа имени осуществляется с помощью описания типа. БНФ: описание_данных =["const "] тип " " имя ["=" константа] { "," имя ["=" константа] } ";" Если в описании присутствует ключевое слово const, то описываемое данное объявляется как немодифицируемое, то есть его значение не может быть изменено в процессе выполнения программы. По умолчанию вновь созданным данным не присваивается никакого значения, поэтому они содержат «мусор», то есть старые значения выделенных ячеек памяти, трактуемые в соответствии со структурой новых данных. Однако, если в описании имеется знак "=" и константа соответствующего типа, то вместе с объявлением переменной происходит ее инициализация, то есть присваивание начального значения. Примеры описаний: int a, b=4, c; /* описывает целые переменные a,b,c */ /* и инициализирует переменную b */ float speed, line; /* описывает вещественные переменные */ /* speed, line */ const double pi=3.14159; /* описывается имя pi, которое */ /* используется как именованная */ /* константа типа double */ Правила записи констант различных типовКонстанты - это объекты данных, которые не меняют своих значений в процессе выполнения программы. Имя константы однозначно определяет и ее тип, и ее значение. В простейшем случае в Си определены три типа констант: целые, вещественные, символьные. Рассмотрим правила их записи. БНФ: беззнаковая_целая_константа= (десятичная|восьмеричная|шестнадцатеричная)["l"|"L"] десятичная = цифра {цифра} восьмеричная = "0" цифра8 {цифра8} шестнадцатеричная = "0" ( "x" | "X" ) цифра16 {цифра16} цифра8 = "0"|"1"|...|"7" цифра16 = "0"|"1"|...|"9"|"A"|"B"|"C"|"D"|"E"|"F" Обычно целые константы имеют тип int, добавление сзади константы буквы l или L обозначает константу типа long. Пример правильных целых констант: 17, 012L, 0x35, 1235L Отрицательные целые константы получаются путем добавления знака "-" перед константой без знака. Значением целой константы является число, которое она обозначает. БНФ: вещ_константа = [“+”|”-“] цифра {цифра} "." {цифра}[ "e" [ "+" | "-" ] цифра {цифра} ] Пример правильных вещественных констант: 12e-33, 12.5, 128.05e-56, 54e23 . Отрицательные вещественные константы получаются путем добавления знака "-" перед константой без знака. Значением вещественной константы является число, которое она обозначает. Символьной константой является любой символ, заключенный в апострофы: 'A', 'c', 'd'. Значение символьной константы - величина целого типа, равная коду символа из таблицы кодов. Для обозначения некоторых невидимых управляющих символов используется специальная кодировка: '\n' - символ перевода строки, '\r' - символ возврата каретки, '\t' - символ табуляции, '\b' - символ возврата на шаг, '\\' - обратная косая черта, '\"' - кавычки, '\0' - символ с кодом 0. Несмотря на то, что специальные символы записываются с помощью двух символов, фактически определяется однобайтовая символьная константа. Символ может быть представлен и его шестнадцатеричным кодом, перед которым необходимо поставить \x. Например: '\x4C'эквивалентно 'L' и т.д. Символьные строкиПоследовательность символов, заключенная в двойные кавычки, представляет собой символьную строку. Двойные кавычки в строку не входят. Например, "Это строка символов". Первая кавычка указывает на начало строки, последняя на ее окончание. Строка символов хранится в памяти ЭВМ как массив символов. Массив символов представляет собой последовательность символов, расположенных в непрерывной области памяти и объединенных общим именем:
Адрес строки (этот адрес указывает на первый символ строки). В конце строки символов компилятор ставит ноль-символ, т.е. символ, код которого равен 0. Он служит признаком конца строки. Значение символьной строки - это адрес ее первого символа. При трансляции программы компилятор разместит все символьные строки в памяти, а в программу вместо них подставит соответствующие адреса (т.е. значения символьных строк!). Символьная строка является константой, т.е. ее невозможно изменить в процессе выполнения программы. На практике часто необходимо выполнять различные действия над символьными строками: например запросить ввод имени пользователя, которое затем используется в выводной информации. Подобные операции возможны, если описать переменную как массив символов. БНФ: описание_массива_символов = "char " имя "["размер"]" { "," имя "["размер"]" } ";" где размер - максимально возможное количество символов плюс 1 для размещения нуль символа. Пример: char name[50], fio[81]; Переменная name способна хранить строку из 49 символов, fio из 80. Значениями переменной name и fio являются адреса областей памяти, выделенных для хранения соответствующих строк. |