Главная страница

Лекции Булатицкий Дмитрий Иванович (во многом по материалам Прасолова А. Н.)


Скачать 319.62 Kb.
НазваниеЛекции Булатицкий Дмитрий Иванович (во многом по материалам Прасолова А. Н.)
Дата11.01.2022
Размер319.62 Kb.
Формат файлаdocx
Имя файлаLecture_Programming_2021_09_01.docx
ТипЛекции
#328427
страница5 из 36
1   2   3   4   5   6   7   8   9   ...   36

Идентификаторы языка Си


Идентификаторы или имена служат для обозначения различных объектов программ: переменных (ячеек памяти), адресов, функций, файлов и т.д., иначе говоря - данных и действий над данными.

Имена должны начинаться с букв латинского алфавита или знака подчеркивания, далее допускается использовать и арабские цифры:

БНФ:

имя = (буква | "_") { буква | цифра | "_" }

буква = "A"|"B"|...|"Y"|"Z"|"a"|"b"|...|"y"|"z"

десятичная_цифра = "0"|"1"|...|"9"
При этом прописные и строчные буквы считаются разными.

Длина имени в ANSI стандарте языка Си не ограничена. В Турбо Си имя не может быть длиннее 32 символов. Например: a, a1, _a, a_b.

Выбор имен должен производиться так, чтобы имя как можно точнее соответствовало смыслу объекта или действия, которое оно обозначает. Например: speed_of_body, SpeedOfBody, BodySpeed.

Экономия на длине имен - плохой стиль программирования.
    1. Понятие о типах данных


Тип данных определяет структуру объекта данных, множество его разрешенных значений и множество операций, которые можно над ним выполнять. Объекты различных типов требуют различного количества памяти для их хранения и различных команд процессора для выполнения действий над ними.
      1. Классификация типов данных


Можно выделить следующие типы:

  • простые:

    • целые (char, short int, int, long int, также к целым типам применим модификатор unsigned);

    • вещественные (float, double, long double);

  • составные: массивы, структуры, объединения, перечисления;

  • указатели.
      1. Основные типы данных языка Си


В языке Си предопределены несколько имен типов:

БНФ:

предопр_тип = "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" )
      1. Описание данных в языке Си


Язык Си относится к языку с жестко определенными типами данных: каждое имя всегда обозначает объект некоторого типа, причем этот тип нельзя изменить до конца выполнения программы.

Назначение типа имени осуществляется с помощью описания типа.

БНФ:

описание_данных =["const "] тип " " имя ["=" константа]

{ "," имя ["=" константа] } ";"

Если в описании присутствует ключевое слово const, то описываемое данное объявляется как немодифицируемое, то есть его значение не может быть изменено в процессе выполнения программы.

По умолчанию вновь созданным данным не присваивается никакого значения, поэтому они содержат «мусор», то есть старые значения выделенных ячеек памяти, трактуемые в соответствии со структурой новых данных. Однако, если в описании имеется знак "=" и константа соответствующего типа, то вместе с объявлением переменной происходит ее инициализация, то есть присваивание начального значения.

Примеры описаний:
int a, b=4, c; /* описывает целые переменные a,b,c */

/* и инициализирует переменную b */

float speed, line; /* описывает вещественные переменные */

/* speed, line */

const double pi=3.14159; /* описывается имя pi, которое */

/* используется как именованная */

/* константа типа double */

      1. Правила записи констант различных типов


Константы - это объекты данных, которые не меняют своих значений в процессе выполнения программы. Имя константы однозначно определяет и ее тип, и ее значение.

В простейшем случае в Си определены три типа констант: целые, вещественные, символьные. Рассмотрим правила их записи.
БНФ:

беззнаковая_целая_константа=

(десятичная|восьмеричная|шестнадцатеричная)["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' и т.д.
      1. Символьные строки


Последовательность символов, заключенная в двойные кавычки, представляет собой символьную строку. Двойные кавычки в строку не входят. Например, "Это строка символов". Первая кавычка указывает на начало строки, последняя на ее окончание.

Строка символов хранится в памяти ЭВМ как массив символов.

Массив символов представляет собой последовательность символов, расположенных в непрерывной области памяти и объединенных общим именем:


Э

т

о




С

т

р

о

к

а




с

и

м

в

о

л

о

в

\0


Адрес строки (этот адрес указывает на первый символ строки).

В конце строки символов компилятор ставит ноль-символ, т.е. символ, код которого равен 0. Он служит признаком конца строки.

Значение символьной строки - это адрес ее первого символа.

При трансляции программы компилятор разместит все символьные строки в памяти, а в программу вместо них подставит соответствующие адреса (т.е. значения символьных строк!).

Символьная строка является константой, т.е. ее невозможно изменить в процессе выполнения программы. На практике часто необходимо выполнять различные действия над символьными строками: например запросить ввод имени пользователя, которое затем используется в выводной информации. Подобные операции возможны, если описать переменную как массив символов.
БНФ:

описание_массива_символов =

"char " имя "["размер"]" { "," имя "["размер"]" } ";"
где размер - максимально возможное количество символов плюс 1 для размещения нуль символа.
Пример:
char name[50], fio[81];
Переменная name способна хранить строку из 49 символов, fio из 80. Значениями переменной name и fio являются адреса областей памяти, выделенных для хранения соответствующих строк.
  1. 1   2   3   4   5   6   7   8   9   ...   36


написать администратору сайта