Строка символов – это последовательность значений типа char, которая сгруппирована в единое целое.

Поскольку символ ‘A’ в кодировке ASCII представлен десятичным значением 65, можно написать этот оператор следующим образом:

char letter = 65; // эквивалент символа А

Это дало бы тот же результат, что и предыдущий оператор.

Важно! Стандарт ISO/ANSI C++ не требует, чтобы тип char представлял однобайтные целые со знаком. Это выбор реализации компилятора: представлять char как целые со знаком в диапазоне от -128 до 127 либо как целые без знака в диапазоне от 0 до 255. Следует иметь это в виду, если может потребоваться переносить код C++ в другую среду.

Тип wchar_t назван так, поскольку это расширенный символьный тип (wide char type) и переменные этого типа сохраняют 2-байтные символьные.

Для инициализации переменных char (как и других целых типов) можно использовать шестнадцатеричные константы, что во многих случаях удобнее. Шестнадцатеричное число записывается с применением стандартного представления шестнадцатеричных цифр: от 0 до 9 и от А до F (или от a до f), означающие в десятичном эквиваленте цифры от 0 до 15. Кроме того, они предваряются сочетанием 0х (или 0Х) для того, чтобы отличать их от десятичных значений. Таким образом, чтобы получить тот же результат, можно переписать оператор, приведенный выше, следующим образом:

charletter = 0x41; // эквивалент символа А

Целочисленные значения с ведущим нулем интерпретируются как восьмеричные значения, поэтому значение, записанное как 065, равно 53 в десятичной нотации.

Переменные целочисленных типов int, short или long сохраняют по умолчанию целые значения со знаком (signed), поэтому их можно применять как для хранения положительных, так и отрицательных значений. Это объясняется тем, что для этих типов по умолчанию принят модификатор типа signed. Поэтому когда пишется int или long это означает signed int или signed long соответственно. Ключевое слово signed можно явно использовать для спецификации типа переменной. В этом случае оно означает signed int, например:

signed value = -5; // Эквивалент signed int

Но такое написание не очень распространено, и многие программисты предпочитают применять int, что выглядит более очевидно.

Диапазон значений, которые могут быть сохранены в переменной типа char, находится в пределах от -128 до +127, что совпадает с диапазоном допустимых значений переменных типа shortchar. Но как это ни прискорбно, тип char и тип signedchar трактуются как разные типы, поэтому не стоит допускать ошибку, думая, что это одно и то же.

Если в переменной необходимо хранить только положительные значения (например, количество человек посетивших лекцию), то желательно специфицировать переменную как unsigned: unsigned long chel = 0UL; Буква U (или u), добавленная к константе – это спецификатор для unsigned. В предыдущем примере к ней был добавлен L, чтобы указать, что константа типа long. Эти символы-модификаторы констант можно использовать в любом регистре и любой последовательности. Однако при указании таких значений желательно придерживаться какого-то согласованного стиля.

Булевские переменные – это такие переменные, которые могут хранить только два значения: true и false.

Тип таких логических переменных называется bool, по имени Джорджа Буля (Gerorge Boole), который разработал булеву алгебру. Тип bool трактуется как целый. Булевские переменные также называют логическими переменными. Переменные типа bool используются для сохранения результата проверок, которые могут принимать значения либо «истина» (true), либо «ложь» (false), например, как в случае проверки равенства одного значения другому.

На самом деле тип bool представляется в коде программы как int. Это наследие тех времен, когда в C++ еще не был реализован тип bool, и для представления логических значений обычно применялись переменные типа int. При этом нулевые значения трактовались как «ложь», а ненулевые – как «истина». Символы TRUE и FALSE все еще применяются в MFC, где они представляют ненулевые целые значения и 0, соответственно. Стоит обратить внимание но то, что TRUE и FALSE, записанные заглавными буквами, не являются ключевыми словами в C++, это просто символы, определенные внутри MFC и, следовательно, они не являются допустимыми значениями типа bool, потому не стоит путать TRUE и true.

 

Числовые переменные, не относящиеся к целым, хранятся как числа с плавающей точкой. Число с плавающей точкой может быть выражено в виде десятичного значения, наподобие 112.5, либо в экспоненциальном виде, таком как 1.125Е2, где десятичная часть умножается на 10 в степени, указанной после Е (экспонента). Таким образом, последнее число – это 1.125×102, что равно 112.5.

Константы с плавающей точкой должны включать десятичную точку, либо экспоненту, либо и то, и другое. Если они будут записаны без них, то получится целое значение.

Можно специфицировать переменную с плавающей точкой, используя ключевое слово double, как в следующем операторе: double in_to_mm = 25.4. Для использования константы типа float, необходимо использовать спецификатор f, как в примере: float pi = 3.14159f (без f константа была бы типа double).

Стандарт C++ ISO/ANSI также определяет тип с плавающей точкой long double, который в MS V S 2008 реализован с тем же диапазоном и точностью, что и double.

Ключевое слово typedef позволяет определить своё собственное имя для существующего типа данных. Используя typedef, можно определить имя типа kol_vo как эквивалент стандартного типа long int, применив следующее объявление:

typedef long int kol_vo; // Определение kol_vo

в качестве имени типа

Это определяет kol_vo как альтернативное имя для long int, поэтому теперь можно объявить переменную mynum типа long int таким объявлением:

kol_vo mynum = 0L; // Определение переменной

типа kol_vo

При этом не будет никакой разницы между таким объявлением и использованием встроенного имени типа. То есть следующий оператор эквивалентен предыдущему:

long int mynum = 0L; // Определение переменной

типа long int

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

Поскольку typedef лишь определяет синоним для существующего типа, это может показаться излишним, однако это вовсе не так. Данное средство играет очень важную роль в упрощении сложных объявлений за счет определения одного имени, представляющего сложную спецификацию типа, что может сделать код более читабельным.

Для определения пользовательских типов данных используются спецификаторы языка enum, struct, class. Ключевым словом struct определяются структуры, а понятие class используется в объектно-ориентированном С++. Остановимся подробнее на понятии перечислений, обозначаемых ключевым словом enum. Иногда возникает потребность в переменных, которые могут принимать значения лишь из ограниченного набора допустимых значений, ссылаться на которые удобно было бы по каким-то меткам, например, дни недели или месяцы года. В C++ предусмотрено специальное средство для таких ситуаций, называемое перечислением (enumeration). В качестве примера рассмотрим переменную, которая должна принимать значения, соответствующие цветам радуги. Её можно определить следующим образом:

enum Color {Red, Orange, Yellow, Green, light_Blue, Blue, Violet} thisColor;

Этот оператор объявляет тип перечисления по имени Color и переменную thisColor, являющуюся экземпляром перечислимого типа Color, которая может принимать только константные значения, указанные в фигурных скобках. Если попытаться присвоить thisColor какое-то значение, не входящее в указанный набор, это вызовет ошибку. Эти символические имена, перечисленные в фигурных скобках, называются перечислителями (enumerators). Фактически каждое из названий цвета автоматически представляется компилятором как фиксированное целое значение. Первое имя в списке – Red – получает значение 0, Orange – 1 и так далее.

Можно присвоить одну из перечисленных констант в качестве значения переменной thisColor, например:

thisColor = Green;

Необходимо обратить внимание на то, что не стоит классифицировать перечислимые константы именем перечисления. Значение thisColor будет равно 3, потому что определенным в перечислении символическим константам присваиваются значения типа int по умолчанию, начиная с 0. По умолчанию каждый последующий элемент перечисления на единицу больше значения предыдущего, но если явно указать начальное значение, отличное от 0, то можно просто написать:

enum Color { Red = 1, Orange, Yellow, Green, light_Blue, Blue , Violet} thisColor;

Теперь константам перечисления будут присвоены значения от 1 до 7. Элементы перечисления не обязательно должны иметь уникальные значения. Можно определить, что и Red, и Orange, например, должны иметь значение 1 с помощью следующего оператора:

enum Color { Red =1,Orange=1,Yellow, Green, light_Blue, Blue , Violet} thisColor;

При этом поскольку, по сути, типом переменной thisColor является int, она займет 4 байта, как и все переменные перечислимого типа.

Имея определение перечисления, можно определить другую переменную того же типа:

enum Color nextColor;

Это определяет переменную nextColor как перечисление, которое может принимать значения, специфицированные ранее. Разрешается опускать ключевое слово enum в объявлении переменной, поэтому предыдущий оператор может быть переписан так:

Color nextColor;

При желании всем перечислителям можно присвоить определенные значения. Например, можно определить следующее перечисление:

enum Punctuation {Comma = ‘,’, Exclamation = ‘!’, Question = ‘?’} things;

Здесь определяются возможные значения переменной things как числовые эквиваленты соответствующих символов таблицы ASCII. Значения элементов перечисления не обязательно должны идти в возрастающем порядке. Если не специфицировать все значения явно, то каждому элементу, значение которого не задано, будет присвоено значение на единицу больше предыдущего.

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

enum {Mon, Tues, Wed, Thurs, Fri, Sat, Sun} thisWeek, nextWeek, lastWeek;

Здесь объявлены три переменные, которые могут принимать значения от Mon до Sun. Поскольку тип перечисления не указан, позднее невозможно на него сослаться. В этом случае вообще нет возможности объявить другие переменные типа этого перечисления, потому что повторять это определение также не разрешается. Попытка сделать это означала бы, что программист собирается переопределить значения от Mon до Sun, а это недопустимо.

Перечислимые константы по умолчанию имеют тип int, но можно указать их тип явно, добавив двоеточие и имя типа для констант вслед за именем типа перечисления в его объявлении. Тип перечислимых констант может быть знаковым либо беззнаковым целочисленным типом: short, int, long, char или же bool. Таким образом, можно определить перечисление, представляющее цвета, следующим образом:

enum Color: char {Red, Orange, Yellow, Green, light_Blue, Blue , Violet};

Здесь константы перечисления будут относиться к типу char, причем первая из них будет равна 0. Однако, имея константы типа char, было бы логично, предпочесть инициализировать их явно:

enum Color: char {Red=’R’, Orange=’O’, Yellow=’Y’, Green=’G’, light_Blue=’B’, Blue=’B’ , Violet=’V’};

Теперь значения констант немного лучше отображают то, что они представляют, хотя не делают различия между light_Blue и Blue. Нет никаких проблем в том, что разные константы имеют одно и то же значение, но имена, конечно, должны быть уникальными.