Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Алгоритмизация и программирование на языке С++. Ч.1. Учебник

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
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
в гораздо более широком диапазоне.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]