Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Алгоритмизация и программирование на языке С++. Ч.1. Учебник
.pdf
3. Переменные итипы данных
31
вания, можно сказать, что это методы и свойства. На рис. 3.2
Equals
представлен метод
, указывающий, равно ли значение
этого экземпляра заданному значению типа или нет [23]. Также на рисунке отображаются имена двух свойств типа
и
MaxValue
MinValue
. Они равны максимальному и минимально-
int:
му значению, возможному для этого типа соответственно.
Рис. 3.2. Методы и свойства класса
int
С++
В языке С++ для определения переменных имеются специальные инструкции описания. Они должны быть записаны для любой используемой в программе переменной. Заметим, что переменная (а в общем случае – объект программы),
получив как свойство определенный тип, уже не может получить другой, новый.
Ранее уже было рассмотрено использование ключевых
слов для задания типа возвращаемого значения функции
main()
. Если рассматривать историю версий языков С и С++,
то состав инструкций для описания типов менялся. К примеру, в первой стандартной версии языка С введено 6 базовых
типов:
int, oat, char, short, long, double
явились новые типы, некоторые исчезли из списка базовых,
а к описанию переменных были добавлены новые элементы.
Например, не стало базовых типов
слова стали модификаторами (при этом тип
по умолчанию). Поэтому разные описания могут приводить
[3]. Со временем по-
short
и
long
. Эти ключевые
int
назначается

32
АЛГОРИТМИЗАЦИЯ ИПРОГРАММИРОВАНИЕ НАЯЗЫКЕ С++
к определению одного объекта. Например,
long
и
int
определяют переменные целого типа, которым отводится одинаковый объем памяти, и, как следствие, они могут принимать
значения из одинаковых диапазонов.
Базовые типы и ключевые слова для их описания приве-
дены в табл. 3.1.
Таблица 3.1
Базовые типы С++
Символьный
Символьный двухбайтовый
Целочисленный
С плавающей точкой
С плавающей точкой двойной точности
Логический (или булевый)
Не имеющий значения
Сделаем замечание о типе
void
. Он применим не к пере-
char
wchar_t
int
oat
double
bool
void
менным, а к функциям, не возвращающим значения (подробнее – см. раздел 9).
Инструкция объявления представляет новую переменную
(или константу). При объявлении указывается тип, и при необходимости переменной может быть присвоено значение.
Для константы указание значения обязательно. В языке C++
инициализация переменной (т.е. присвоение ей начального
значения) является обязательным условием. Начальное значение может быть задано при объявлении переменной (с помощью оператора присваивания или круглых скобок), а также в процессе выполнения программы. Если инициализация
переменной осуществляется при ее объявлении, то вначале
указывается класс памяти, тип данных, затем имя переменной и, наконец, инициализатор – литерал соответствующего
типа:
[класс памяти] [const] тип имя [инициализатор];
Имеется 4 ключевых слова, задающих класс памяти:
и
extern, static
register
.
auto,

3. Переменные итипы данных
33
В языках программирования важными свойствами переменных является время жизни переменных и область кода, в кото-
auto
рой можно их использовать. Класс памяти
определяет, что
значение переменной расположено в стеке, который освобождается, когда происходит выход из блока, где определена переменная такого класса памяти. Это описание предполагает, что тип
переменной может быть задан (определяется) при инициализации. Примеры такого описания переменных приводятся далее.
extern
Если использовано ключевое слово
, то переменная
доступна во всех частях программы. Такое описание не имеет
смысла, если описание переменной осуществляется вне какойлибо функции программы.
static
Переменная, определенная как
, существует в программе постоянно. Это не предполагает освобождения памяти
(например, стека) во время исполнения кода. Память может
быть использована не экономно, зато нет потери в производительности.
В виде констант задаются неизменяемые в программе ве-
Pi
и
личины. Например, если объявлены константы
sqr2
const double Pi=3.14159, sqr2 (1.414);
то их значения не могут быть в дальнейшем изменены в программе, например:
Pi=1.0;
вызовет сообщение об ошибке:
[Error] assignment of read-only variable 'Pi'
В этом примере показано, как можно инициализировать
значения переменных и констант базового типа с использованием оператора присваивания (знак равенства) или круглых скобок.
Тип переменной определяется ключевым словом (см.
табл. 3.1). Но к нему может быть добавлен модификатор
(приставка). Определено 4 модификатора:
short
и
. Первые два связаны со знаком числа, а третье и чет-
signed, unsigned, long
вертое – с количеством выделенной памяти. Все 4 применя-
int
ются к целому базовому типу
long
дификатор
также может применяться и к типу
, а первые два – к
char
. Мо-
double
.

34
АЛГОРИТМИЗАЦИЯ ИПРОГРАММИРОВАНИЕ НАЯЗЫКЕ С++
На рис. 3.3 приведена иллюстрация сравнительных размеров области памяти, выделяемой для разных типов данных [24].
Рис. 3.3. Сравнительные размеры областей памяти,
выделяемых для данных разных типов
Приведем пример, в котором вычисляется значение фак-
short
и
int
ториала с использованием переменных типа
:
short i, f=1;
int =1;
for (i=1; i<10; i++)
{
f=f*i;
=*i;
cout.width(3);
cout << right << i << " ";
cout.setf(ios::right);
cout.width(7);
cout << f << " ";
cout.setf(ios::right);
cout.width(7);
cout << right << << endl;
}

3. Переменные итипы данных
35
Как видно из этого примера, переменная типа
short
не может корректно хранить значение факториала числа, превосходящего 7 (рис. 3.4).
Рис. 3.4. Значение факториала для переменных типа
short
и
int
В этом фрагменте программы используются средства форматирования вывода, которые будут подробно описаны далее.
Здесь укажем только, что строки
cout.width(3);
cout.width(7);
определяют вывод, длиной 3 и 7 позиций соответственно, а
строка
cout.setf(ios::right);
означает, что вывод надо форматировать по правому краю.
Далее приведем фрагмент программы, показывающий тип и
размеры переменных символьного и целого типа. Заметим, что
в программе показаны примеры переноса текста инструкций,
состоящих из нескольких строк. Можно перенести длинную инструкцию перед знаком операции или именем переменной. Также можно перед строкой, где будет записан код, продолжающий
\
инструкцию на следующей строке, поставить обратный слеш (
).
cout << " Type – char int short long" << endl;
char char1 = "1";
cout << " type char: " << typeid(char1).name() \
<< " " << sizeof(char1) << " bytes\n";

36
АЛГОРИТМИЗАЦИЯ ИПРОГРАММИРОВАНИЕ НАЯЗЫКЕ С++
wchar char2 = ‘1’;
cout << " type wchar: " << typeid(char2).name() \
<< " " << sizeof(char2) << " bytes\n";
int int2 = 1;
cout << " type int: " << typeid(int2).name() \
<< " " << sizeof(int2) << " bytes\n";
// NO NO NO = int Val%; oat temp^;
short int shortInt3 = 1;
cout << " type short_int: " << typeid(shortInt3).name() \
<< " " << sizeof(shortInt3) << " bytes\n";
short short4 = 1;
cout << " type short: " << typeid(short4).name() \
<< " " << sizeof(short4) << " bytes\n";
long int longInt5 = 1;
cout << " type long_int: " << typeid(longInt5).name() \
<< " " << sizeof(longInt5) << " bytes\n";
long long6 = 1;
cout << " type long: " << typeid(long6).name() \
<< " " << sizeof(long6) << " bytes\n";
long long longLong7 = 1;
cout << " type long_long: " << typeid(longLong7).name()
<< " " << sizeof(longLong7) << " bytes\n";
system("pause");
Результат приведен на рис. 3.5.
Рис. 3.5. Тип и объем памяти, выделяемой для хранения
переменных, описанных как целые

3. Переменные итипы данных
37
В следующем примере определяется значение переменных, хранящих вещественные значения (в форме с плавающей точкой).
const double Pi=3.14159, sqr2(1.414);
cout.setf(ios::xed);
cout << "Pi " << endl;
cout.width(15);
cout.precision(12);
cout << Pi << endl;
cout << "sqr2_4 symbol double " << endl;
cout.width(15);
cout.precision(12);
cout << sqr2 << endl;
cout << "sqrt(2.0)= function " << endl;
cout.width(15);
cout.precision(12);
cout << sqrt(2.0) << endl;
long double sqr2_ld;
sqr2_ld=sqrt(2.0);
cout << "sqr2_ld=sqrt(2.0) long double " << endl;
cout.width(15);
cout.precision(12);
cout << sqr2_ld << endl;
oat sqr2_f;
sqr2_f=sqrt(2.0);
cout << "sqr2_f=sqrt(2.0) oat " << endl;
cout.width(15);
cout.precision(12);
cout << sqr2_f << endl;
Результат приведен на рис. 3.6.

38
АЛГОРИТМИЗАЦИЯ ИПРОГРАММИРОВАНИЕ НАЯЗЫКЕ С++
Рис. 3.6. Вычисления для переменных типа
Как видно, для числа типа
long double
long double
и
oat
и числа типа
oat
совпадает только семь знаков в дробной части. Это связано
oat
с тем, что переменной типа
деляется 32 бита, а переменной типа
для хранения значения вы-
long double
– 64 бита (что
обеспечивает бóльшую точность представления числа).
Приведем текст программы, в которой значение корня
квадратного из числа 2 выводится в экспоненциальной форме (рис. 3.7).
Рис. 3.7. Вывод чисел в экспоненциальной форме
Теперь приведем фрагмент программы, показывающей
объемы памяти для данных вещественного типа с разными
способами описания.
cout << " Type oat double " << endl;
oat oat8 = 1.0;
cout << " type oat: " << typeid(oat8).name()
<< " " << sizeof(oat8) << " bytes\n";
long oat long_oat9 = 1.0;

3. Переменные итипы данных
39
cout << " type long_oat: " << typeid(long_oat9).name()
<< " " << sizeof(long_oat9) << " bytes\n";
double double10 = 1.0;
cout << " type double: " << typeid(double10).name()
<< " " << sizeof(double10) << " bytes\n";
long double long_double11;
cout << " type long_double: " << typeid(long_double11).name()
<< " " << sizeof(long_double11) << " bytes\n";
Результат выполнения приведен на рис. 3.8.
Рис. 3.8. Тип и объем памяти, выделяемой для хранения
переменных, описанных как вещественные
Диапазон допустимых значений переменных определяется их типом и разрядностью компилятора. В табл. 3.2 представлены информация об имени, выделяемой памяти, синонимах и диапазоне значений типов переменных С++ [25].
Таблица 3.2
Характеристика типов данных в С++
Имя типа Байты Другие имена Диапазон значений
Int
unsigned int
__int8
unsigned
__int8
__int16
unsigned __
int16
4
4
1
1
2
2
signed
unsigned
char
unsigned char
short, short int,
signed short int
unsigned short,
unsigned short int
От –2 147 483 648
до 2 147 483 647
От 0 до 4 294 967 295
От –128 до 127
От 0 до 255
От –32 768 до 32 767
От 0 до 65 535

40
АЛГОРИТМИЗАЦИЯ ИПРОГРАММИРОВАНИЕ НАЯЗЫКЕ С++
Окончание табл. 3.2
Имя типа Байты Другие имена Диапазон значений
__int32
unsigned __
int32
__int64
unsigned __
int64
Bool
Char
signed char
unsigned
char
Short
unsigned
short
Long
unsigned
long
long long
unsigned
long long
Enum
Float
Double
long double
wchar_t
4
4
8
8
1 Нет false либо true
1 Нет По умолчанию от –128 до 127
1 Нет От –128 до 127
1 Нет От 0 до 255
2
2
4
4
8
8
Непостоянно Нет
4 Нет 3,4E +/– 38 (7 знаков)
8 Нет 1,7E +/– 308 (15 знаков)
То же самое,
что и double
2
signed, signed
int, int
unsigned, unsigned
int
long long,
signed long long
unsigned long long
short int, signed
short int
unsigned short int
long int, signed
long int
unsigned long int
none (но эквивалентно __int64)
none (но эквивалентно unsigned
__int64)
Нет То же, что double
__wchar_t
От –2 147 483 648
до 2 147 483 647
От 0 до 4 294 967 295
От –9 223 372 036 854 775 808
до 9 223 372 036 854 775 807
От 0
до 18 446 744 073 709 551 615
От 0 до 255 при компиляции
с помощью
От –32 768 до 32 767
От 0 до 65 535
От –2 147 483 648
до 2 147 483 647
От 0 до 4 294 967 295
От –9 223 372 036 854 775 808
до 9 223 372 036 854 775 807
От 0
до 18 446 744 073 709 551 615
От 0 до 65 535
/J
Замечание. В зависимости от реализации для типа может быть определено более 8 байт, что позволяет хранить
числа
long double
в гораздо более широком диапазоне.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
