Алфавит, базовые типы и описание данных
Алфавит языка включает практически все символы, имеющиеся на стандартной клавиатуре компьютера: · латинские буквы A...Z, a...z; · цифры 0...9; · знаки операций и разделители: { }, [ ], (),.,,, ->, &, *, +, –, ~,!, \, %,?,:,;, =, <, >, |, #, ^. Некоторые операции обозначаются комбинациями символов; значения символов операций в ряде случаев зависят от контекста, в котором они употреблены. Типы данных. Базовые (предопределенные) типы данных объединены в две группы: данные целого типа и данные с плавающей точкой (вещественные). Данные целого типа - целые со знаком (signed) и целые без знака (unsigned). По числу разрядов, используемых для представления диапазона значений такого типа различают: обычные целые (int), короткие целые (short int) и длинные целые (long int). Символьные данные (char) также рассматриваются как целые и могут быть со знаком или без знака. Константы целого типа записываются как наборы десятичных цифр, тип константы зависит от количества цифр в записи константы и может быть уточнен добавлением в конце константы букв L или l (тип long), U или u (тип unsigned) или их сочетания: 321 - константа типа int, 5326u - константа типа unsigned int, 45637778 - константа типа long int, 2746L - константа типа long int. Целые константы могут записываться в восьмеричной системе счисления, в этом случае первой цифрой должна быть цифра 0, число может содержать только цифры 0... 7: 0777 - константа типа int, 0453377 - константа типа long. Целые константы можно записывать и в шестнадцатеричной системе счисления, в этом случае запись константы начинается с символов Ох или ОХ: 0x45F - константа типа int, OxFFFFFFFF - константа типа unsigned long. Константы char всегда заключаются в кавычки, значение константы задается знаком из используемого набора символов либо целой константой, которой предшествует обратная косая черта: 'А', '\33', '\042', '\х1В'. Имеются и другие символы, которые могут указываться в качестве значений константы char: · '\n' - новая строка; · '\t' - горизонтальная табуляция; · '\v' - вертикальная табуляция; · '\r' - перевод каретки; · '\f' - перевод страницы; · '\а' - звуковой сигнал; · '\’' - одиночная кавычка (апостроф); · '\”' - двойная кавычка; · '\\' - обратная косая черта. Вещественные данные могут быть значениями одного из трех типов: float, double, long double. Диапазон значений каждого из этих типов зависит от используемого компилятора. Константы вещественных типов записываются в естественной или экспоненциальной формах и по умолчанию имеют тип double, например 15.31, 1.43Е-3, 2345.1е4. При необходимости тип константы можно уточнить, записав в конце суффикс f или F для типа float, либо суффикс l или L для типа long double. Объявление переменных. Внешнее определение, объявляющее переменные, состоит из необязательного спецификатора класса памяти, спецификаторов типа и списка деклараторов-инициализаторов, каждый из которых объявляет идентификатор одной переменной и, возможно, значение, присваиваемое переменной при ее объявлении. Внешнее определение заканчивается точкой с запятой: int i, j, k; // Три переменных типа int без явной // инициализации double х=1, у=2; //Две переменных типа double // с начальными значениями 1 и 2 char c1='0'; // Переменная типа char, ее // значение - код литеры 0 Текст, записанный в этих примерах после знаков //, является комментарием и служит только для документирования программы. Такой комментарий может занимать лишь одну строку текста и допускается в текстах программ на C++. Комментарий, занимающий несколько строк, заключается в специальные скобки /* и */. В качестве спецификаторов класса памяти во внешнем определении указывается одно из слов extern, static, typedef. Спецификатор extern означает, что объявляемый объект принадлежит другому программному файлу, а здесь дается информация только о его имени и типе, и не должно присутствовать инициализирующее выражение. Спецификатор static ограничивает область действия объявляемого имени данным файлом или блоком, если объявление содержится в блоке. Спецификатор typedef служит для присвоения имени описываемому типу данных. Если объявление объекта содержится внутри тела функции (локальное объявление), то можно указывать спецификаторы класса памяти register или auto. Спецификатор register носит рекомендательный характер, компилятор пытается разместить данные этого класса в регистре процессора, если в текущий момент имеются свободные регистры. Спецификатор auto принимается по умолчанию и поэтому явно не указывается; он означает, что объект класса auto размещается в программном стеке при вызове функции. В C++ предусмотрены константы, которым присваиваются собственные имена, - именованные константы. В описании именованной константы присутствует const, например; const double Pi = 3.141592653; Переменной, идентификатор которой объявлен с описателем const, нельзя присвоить иное значение, чем было установлено при объявлении идентификатора. Инициализирующее значение при объявлении константы является обязательным. Наряду с базовыми целыми и вещественными типами различных размеров в программе могут объявляться и использоваться данные типов, определяемых программистом: указатели, ссылки, данные перечисляемого типа. Данные перечисляемого типа. Этот тип применяется для данных целого типа, которые могут принимать ограниченный набор значений. Каждому значению соответствует собственное имя-идентификатор и целое число, значение этого имени. Объявление перечисляемого типа строится по схеме: enum идентификатор { список перечисления } деклараторы-инициализаторы; Здесь идентификатор задает имя перечисляемого типа; список перечисления состоит из перечислителей, разделенных запятыми. Каждый перечислитель задается идентификатором и, возможно, целым значением типа char или int, например: enum color { RED, GREEN, BLUE } en_color; enum lex_type { CNST, VAR, OPER=3, FUNC }; Любой перечислитель по умолчанию имеет значение на 1 больше предыдущего. Если значение перечислителя не задано, первый из них получает значение 0, а каждый последующий - значение, большее на 1. В C++ принято записывать идентификаторы перечислителей прописными буквами. Имена перечислителей используются либо как именованные константы, либо для присваивания переменным перечисляемого типа. Для ссылок на переменную того или иного типа в C++ служат указатели. Указатель - это тип данного, значением которого является адрес другого объекта. При объявлении указателя перед идентификатором записывается знак *(звездочка). Указатель может инициализироваться адресом данного, для получения адреса служит операция & (амперсанд): double у; double *px, *ру = & у; Для указателей определены операции сравнения, сложения указателя с целым числом, вычитания двух указателей, а также операция индексирования ([ ]). Для обращения к переменной по указателю выполняется операция разыменования, обозначаемая знаком*, например *ру =7.5. При объявлении указателя может использоваться описатель const, например: const int cc = 20; const int *pc = & cc; // Можно инициализировать // адресом константы double *const delta = 0.001; // Указатель-константа Ссылки на переменную. Кроме обычных переменных и указателей в C++ имеется тип ссылка на переменную, задающий для переменной дополнительное имя (псевдоним). Внутреннее представление ссылки такое же, как указателя, т.е. в виде адреса переменной, но обращение к переменной по ссылке записывается в той же форме, что и обращение по основному имени. Переменная типа ссылки всегда инициализируется заданием имени переменной, к которой относится ссылка. При объявлении ссылки за именем типа записывается знак &: int х; int& px = х; При таком описании операторы рх = 5 и х = 5 эквивалентны. Массивы. Из переменных любого типа могут образовываться массивы. При объявлении массива в деклараторе-инициализаторе за идентификатором массива задается число элементов массива в квадратных скобках: int а[5]; // Массив из пяти элементов типа int Индексы элементов массива всегда начинаются с 0, индекс последнего элемента на единицу меньше числа элементов в массиве. Массив может инициализироваться списком значений в фигурных скобках: int t[4] = { 1, 2, 3, 4 }; При наличии списка инициализации, охватывающего все элементы массива, можно не указывать число элементов массива, оно будет определено компилятором: int w[] = { 1, 2, 3 }; // Массив из трех элементов Массивы с размерностью 2 и более рассматриваются как массивы массивов и для каждого измерения указывается число элементов: Массивы типа char могут инициализироваться строковым литералом. Строковый литерал - это последовательность любых символов, кроме кавычек и обратной косой черты, заключенных в кавычки. Если строковый литерал не умещается на одной строке, его можно прервать символом «\» и продолжить с начала следующей строки. В стандарте C++ предусмотрена и другая возможность записи длинных литералов в виде нескольких записанных подряд строковых литералов. Если между строковыми литералами нет символов, отличных от пробелов, такие литералы сливаются компилятором в один. При размещении в памяти в конце строкового литерала добавляется символ «\0», т.е. нулевой байт. Строковый литерал применяется и для инициализации указателя на тип char: char str1[11] = " Это строка", str2[] =" Размер этого массива определяется числом знаков в литерале + 1"; char *pstr = " Указатель с инициализацией строкой"; Имя массива в C++ является указателем-константой, ссылающимся на первый элемент массива, имеющий индекс, равный нулю. Для обращения к элементу массива указывается идентификатор массива и индекс элемента в круглых скобках, например w[2], a[0] [1]. Идентификаторы, определенные как зарезервированные слова, в другом качестве использоваться не могут (табл.4.1).
Таблица 4.1 Зарезервированные слова C++
Идентификаторы, содержащие двойное подчеркивание " ___", резервируются для реализаций C++ и стандартных библиотек и программистами не могут употребляться.
|