Переменные. Основные типы данных
Любая программа, суть которой не есть вывод на экран некоторой текстовой информации, содержит описание переменных. Переменная это пара “имя” – “значение”. Имени соответствует адрес участка памяти, выделенной переменной, а значением является содержимое этого участка. Именем переменной служит идентификатор. В С идентификатор – это последовательность из букв латинского алфавита, десятичных цифр и символов подчеркивания, начинающаяся не с цифры. Прописные и строчные буквы различаются. Примеры идентификаторов:
i, i2, i_2, stroka, STROKA, F_I_O .
На длину различаемой части идентификатора конкретные реализации компилятора накладывают свои собственные ограничения. Например, компилятор фирмы Borland различают не более 32–х первых символов любого идентификатора.
Каждая переменная и каждое выражение в программе имеет тип, определяющий операции, которые могут над ними производиться. Все типы языка С делят на основные и производные. Переменные типизируются с помощью описаний. Для описания переменных основных типов используют ключевые слова, содержащиеся в таблице 2.
Описание переменных заданного типа имеет следующий формат:
тип имя1 [иницал._выражение1], имя2 [иницал._выражение2],…; где
тип– один из основных типов (таблица 2);
имя – идентификатор;
инициал._выражение – необязательный инициализатор, определяющий начальное значение соответствующего объекта.
Синтаксис инициализатора переменной:
= инициал._выражение
либо
(инициал._выражение).
Таблица 2. Основные типы данных
Тип данных | Диапазон значений |
char (символьный) | –128…127 |
short (короткий целый) | –32768…32767 |
int (целый) | –32768…32767 |
long (длинный целый) | –2147483648…2147483647 |
unsigned char (беззнаковый символьный) | 0…255 |
unsigned int (беззнаковый целый) | 0…65535 |
unsigned long (беззнаковый длинный целый) | 0…4294967295 |
float (вещественный) | 3.4Е–38…3.4Е+38 |
double (вещественный с удвоенной точностью) | 1.7Е–308…1.7Е+308 |
long double (длинный вещественный с удвоенной точностью) | 3.4Е–4932…3.4Е+4932 |
Приведем несколько примеров.
int i,j,k,n=10; // Определены целые переменные i,j,k,n и только n
//инициализирована значением 10;
char simbol1= ‘\n’;// Определена символьная переменная simbol1 co
// значением ‘\n’
double pi=3,1415926535897932385; // Определена вещественная
//переменная pi с удвоенной точностью co
//значением 3,1415926535897932385
К основному типу можно применять спецификатор const. Это дает тип, имеющий те же свойства, что и исходный тип, за исключением того, что значение переменных типа const не может изменяться после инициализации. Например,
const float pi = 3,14;
const char plus = '+';
В данном случае говорят, что описаны константы. Символ, заключенный в одинарные кавычки, является символьной константой. Константа должна инициализироваться при описании. Для переменных инициализация необязательна, но настоятельно рекомендуется. Оснований для введения локальной переменной без ее инициализации очень немного.
Кроме типов, приведенных в таблице 2, к основным типам относят логический тип bool,перечислимый тип enum и тип void (отсутствие значения).
Логические переменные (типа bool) могут принимать одно из двух значений: истина (true) или ложь (false). Логические переменные используются для выражения результатов логических операций. Например,
bool c = a = = b; //= означает присваивание, = = проверка равенства
Если а и b имеют одинаковые значения, то c будет равно true, в противном случае – false. По определению true имеет значение 1 при преобразовании к целому типу, а false– 0. При преобразовании целочисленного значения к логическому типу 0преобразуется в false, а число, отличное от нуля – в true.
Перечислимый тип, который вводится с помощью служебного слова enum, по существу описывает целые константы (типа int), которым приписаны уникальные и удобные для использования имена. Например,
return false">ссылка скрытаenum {one=1,two=2,three=3};
Здесь one, two, three – произвольным образом выбранные программистом идентификаторы для обозначения констант 1,2,3. После такого определения в программе наряду, например, с константой 2 можно использовать ее обозначение two. Если в определении перечислимых констант опустить знаки “=” и не указывать числовых значений, то они будут присваиваться идентификаторам по умолчанию следующим образом: самый левый в фигурных скобках идентификатор получит значение 0, а каждый последующий увеличивается на 1. Имена перечислимых констант должны быть уникальными, однако к значениям констант это не относится. Одно значение могут иметь разные константы. Для перечислимых констант можно ввести имя типа, соответствующего приведенному списку констант, например, определение
enum week {Sunday, Monday, Tuesday, Wednesор typedef,можно вводить в программе удобные обозначения для сложных описаний типов. Например,
typedef unsigned char UC;
UC simbol;
Здесь вводится новый тип UC и переменная этого типа simbol, значениями которой являются беззнаковые числа в диапазоне от 0 до 255.
Для определения размера (в байтах) области памяти, выделяемой для переменной определенного типа, в С используется операция sizeof. Разрешены два формата операции
sizeof (имя_переменной)
или
sizeof (тип данных).
Например, пусть определена переменная int i. Тогда операция sizeof(i) определит, сколько байт выделено для переменой i.
Соотношение между основными типами можно записать так:
1==sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <=sizeof(float) <= sizeof(double)
Каждый, описанный в программе объект (в частности, переменная), имеет следующие основные характеристики:
- область действия идентификатора – эта та часть программы, в которой идентификатор может быть использован для доступа к связанному с ним объекту (обычно имя переменной действует с места ее определения и до конца блока {}, в котором она была определена);
- видимость объекта (данное понятие необходимо в связи с возможностью повторных определений идентификатора внутри вложенных блоков);
- продолжительность существования, которая определяет период, в течение которого идентификаторам в программе соответствуют конкретные объекты в памяти. Определены три вида продолжительности: статическая, локальная и динамическая;
- класс памяти – определяет размещение объекта в памяти и продолжительность его существования.
Определенные операции могут в зависимости от их операндов вызывать преобразование значения операнда от одного типа к другому. Например,
char сh= ‘a’;
int k = ch; // символьный тип преобразуется к целому
printf(“%d”, k;) // на экран выведется ASCII–код символа ch
Иногда необходимо явным образом преобразовывать типы, например, для вывода на экран ASCII–кода символа ch без использования вспомогательной переменной целого типа будем писать
printf(“%d”, (int) ch); printf(“%d”, int (ch)); ;
Использовать допустимые неявные преобразования типов необходимо с большой осторожностью. (Подробнее об этом см. [7], стр. 909, [6] , стр. 85.)