Файл: Понятие переменной в программировании. Виды и типы переменных (ПЕРЕМЕННЫЕ).pdf
Добавлен: 17.05.2023
Просмотров: 54
Скачиваний: 2
Далее, дату можно представить в виде набора из трех чисел (число, месяц и год), которые обычно отделяют друг от друга в одной записи точками. Очевидно, что сложение двух дат едва ли можно понять как сложение двух чисел. Набор из нескольких чисел — более сложный объект, чем отдельное число. Однако прибавление к дате некоторого обычного числа вполне разумно интерпретировать как некую новую дату, следующую за исходной спустя заданное число дней. Вычисление этой даты, т. е. представление в виде набора из трех чисел не совсем тривиально (нужно знать, сколько дней в каждом месяце и году). Иначе говоря, операции над датами отличаются от простых арифметических операций над обычными числами, а потому даты также относят к особому типу данных.
В языках программирования существуют так называемые встроенные типы данных. Это общезначимые, наиболее часто употребляемые и достаточно отчетливо интерпретируемые всеми типы. Вместе с тем, современные языки программирования допускают задание программистом своих особенных типов данных. Например, вы можете определить тип данных НЕДЕЛЯ, который содержит 7 элементов, представленных целыми числами (например, 1, 2,...,7) или названиями дней (например, "понедельник", "вторник", ..., "воскресенье").
Во многих языках (например, С и Pascal) переменные и их тип должны быть объявлены прежде, чем они будут использованы в программе. Если при этом переменная изначально была объявлена, например, как числовая, то уже нигде в программе ей нельзя присвоить значение какого-нибудь другого типа. Говорят, что это языки с сильным контролем типов. Однако есть языки со слабым контролем типов (их еще называют языками со свободными или динамическими типами), типичные примеры — JavaScript и РНР. В них тип переменной не фиксируется раз и навсегда в пределах программы, одна и та же переменная в различных фрагментах программы может принимать значения то одного, то другого типа по усмотрению программиста.
3 ТИПЫ ПЕРЕМЕННЫХ
Переменные могут быть глобальными и локальными. Глобальные доступны (т. е. видны) из любого места программы, локальные — только в том блоке программного кода (фрагменте программы), где они были созданы. Типичный пример блока кода — функция. Функция может содержать в своем коде переменные, недоступные (невидимые) из внешней по отношению к ней части программы.
Переменная в императивном программировании — поименованная, либо адресуемая иным способом область памяти, адрес которой можно использовать для осуществления доступа к данным. Данные, находящиеся в переменной (то есть по данному адресу памяти), называются значением этой переменной.
В других парадигмах программирования, например, в функциональной и логической, понятие переменной оказывается несколько иным. В таких языках переменная определяется как имя, с которым может быть связано значение, или даже как место для хранения значения.
Область видимости и/или время существования переменной в некоторых языках задаётся классом памяти: Статическая и динамическая типизация переменных.
Если тип переменной определяется на этапе компиляции, имеет место статическая типизация, а если на этапе выполнения программы — динамическая. В последнем случае иногда говорят, что переменная не имеет типа, хотя данные, содержащиеся в ней, безусловно, относятся к определённому типу данных, но выясняется это уже во время выполнения программы.
В большинстве случаев статическая типизация позволяет уменьшить затраты ресурсов при выполнении программы, поскольку для динамической типизации требуются затраты ресурсов на выяснение типов данных их приведение в выражениях с смешанными типами. Статическая типизация позволяет перекладывать проверку типов на этапе компиляции программы. Это также упрощает обнаружение ошибок ещё на этапе разработки, когда их исправление обходится менее дорого. Тем не менее во многих случаях необходимо применение динамической типизации. Например, необходимость поддержания совместимости при переходе на новый формат представления данных (например, старая часть проекта посылает процедуре дату символьной строкой, а новые объекты используют более современный числовой тип).
Адрес поименованной ячейки памяти также может определяться как на этапе компиляции, так и во время выполнения программы. По времени создания переменные бывают статическими и динамическими. Первые создаются в момент запуска программы или подпрограммы, а вторые создаются в процессе выполнения программы.
Динамическая адресация нужна только тогда, когда количество поступающих на хранение данных заранее точно не известно. Такие данные размещают в специальных динамических структурах, тип которой выбирается в соответствии со спецификой задачи и с возможностями выбранной системы программирования. Это может быть стек, куча, очередь и т. п. Даже файл, в том смысле, который заложил Н.Вирт в Паскаль, является динамической структурой.
По зоне видимости различают локальные и глобальные переменные. Первые доступны только конкретной подпрограмме, вторые — всей программе. С распространением модульного и объектного программирования, появились ещё и общие переменные (доступные для определённых уровней иерархии подпрограмм). Область видимости иногда задаётся классом памяти. Ограничение видимости может производиться путём введения пространств имён.
Ограничение зоны видимости придумали как для возможности использовать одинаковые имена переменных (что разумно, когда в разных подпрограммах переменные выполняют похожую функцию), так и для защиты от ошибок, связанных с неправомерным использованием переменных (правда, для этого программист должен владеть и пользоваться соответствующей логикой при структуризации данных).
По наличию внутренней структуры, переменные могут быть простыми или сложными (составными).
Простые переменные не имеют внутренней структуры, доступной для адресации. Последняя оговорка важна потому, что для компилятора или процессора переменная может быть сколь угодно сложной, но конкретная система (язык) программирования скрывает от программиста её внутреннюю структуру, позволяя адресоваться только «в целом».
Сложные переменные программист создаёт для хранения данных, имеющих внутреннюю структуру. Соответственно, есть возможность обратиться напрямую к любому элементу. Самыми характерными примерами сложных типов являются массив (все элементы однотипные) и запись (элементы могут иметь разный тип).
Следует подчеркнуть относительность такого деления: для разных программ одна и та же переменная может иметь разную структуру. Например, компилятор различает в переменной вещественного типа 4 поля: знаки мантиссы и порядка, плюс их значения, но для программиста, компилирующего свою программу, вещественная переменная — единая ячейка памяти, хранящая вещественное число.
4 ПЕРЕМЕННЫЕ В ЯЗЫКЕ С++
Для хранения различных данных в языках программирования используют переменные. Переменной называется область памяти, имеющая имя, которое иначе называют идентификатором.
Давая переменной имя, программист одновременно тем же именем называет и область памяти, куда будут записываться значения переменной для хранения.
Хорошим стилем является осмысленное именование переменных. Разрешается использовать строчные и прописные буквы, цифры и символ подчёркивания, который в С++ считается буквой. Первым символом обязательно должна быть буква, в имени переменной не должно быть пробелов. В современных версиях компиляторов длина имени практически не ограничена. Имя переменной не может совпадать с зарезервированными ключевыми словами. Заглавные и строчные буквы в именах переменных различаются, переменные a и A — разные переменные.
Пример зарезервированных ключевых слов:
1 and альтернатива оператору &&
2 and_eq альтернатива оператору &=
3 asm вставить код на ассемблере
4 auto объявить локальную переменную
5 bitand альтернатива оператору bitwise &
6 bitor альтернатива оператору |
7 bool объявить булеву переменную
8 break выйти с цикла
9 case определенная ветка в операторе ветвления switch
10 catch обработать исключение от throw
11 char объявить символьную переменную
12 class объявить класс
13 compl альтернатива оператору ~
14 const объявить неизменяемые данные или функцию, которая не изменяет данных
15 const_cast приведение типа от константной переменной
16 continue пропустить код до конца цикла и начать новую итерацию
17 default вариант по умолчанию в switch
18 delete освобождение памяти, выделенной new
19 do оператор цикла
20 double объявить вещественное число двойной точности
21 dynamic_cast выполнить приведение типов во время выполнения
22 else ветка оператора if, которая выполняется при ложном условии
23 enum создание перечисляемого типа
24 explicit использовать данный конструктор только при полном соответствии типов
25 export позволить разделить объявление и реализацию шаблона
26 extern указание компилятору, что переменная объявлена в другом файле
27 false константа для ложного значения булевой переменной
28 float объявить вещественную переменную
29 for оператор цикла
30 friend разрешить другим функциям доступ к приватным данным класса
31 goto безусловный переход
32 if оператор условия
33 inline оптимизация вызовов для функций (встраиваемые функции)
34 int объявить переменную целого типа
35 long объявить следующий тип длинным
36 mutable перекрыть константность
37 namespace определить новое пространство имен
38 new выделить динамическую память под новую переменную
39 not альтернатива оператору !
40 not_eq альтернатива оператору !=
41 operator создание перегруженных операторов
42 or альтернатива оператору ||
43 or_eq альтернатива оператору |=
44 private объявить приватное поле класса
45 protected объявить защищенное поле класса
46 public объявить общее поле класса
47 register запрос компилятору на оптимизацию переменной по скорости
48 reinterpret_cast изменить тип переменной
49 return возврат из функции
50 short объявить короткое целое
51 signed сделать данный целый тип знаковым
52 sizeof возвратить размер переменной или типа
53 static создать статическую переменную
54 static_cast сделать не полиморфное приведение типов
55 struct определить новую структуру
56 switch оператор ветвления
57 template создать шаблонную функцию
58 this указатель на текущий объект
59 throw выбросить исключение
60 true константа для истинного значения булевой переменной
61 try выполнить код, который может выкинуть исключение
62 typedef создание нового типа с существующего
63 typeid задать описание объекта
64 typename объявить класс или иной новый тип данных
65 union структура, содержащая несколько переменных в одной области памяти
66 unsigned объявить беззнаковое целое
67 using импортировать полностью или частично указанное пространство имен внутрь текущего блока
68 virtual создать виртуальную функцию
69 void объявить функцию или переменную без типа
70 volatile предупреждение компилятору, что переменная может измениться сама
71 wchar_t объявить переменную типа wide-character
72 while оператор цикла
73 xor альтернатива оператору ^
74 xor_eq альтернатива оператору ^=
В языке С++ все переменные должны быть объявлены. Это означает, что, во-первых, в начале каждой программы или функции Вы должны привести список всех используемых переменных, а во-вторых, указать тип каждой из них.
При объявлении переменной компилятор отводит ей место в памяти в зависимости от её типа. Стандартными средствами AVR GCC работает с типами данных char (символьный тип) и int(целочисленный тип).
char - является самым экономным типом. Тип char может быть знаковым и беззнаковым. Обозначается, соответственно, как "signed char" (знаковый тип) и "unsigned char" (беззнаковый тип). Знаковый тип может хранить значения в диапазоне от -128 до +127. Беззнаковый - от 0 до 255. Под переменную типа char отводится 1 байт памяти (8 бит).
Ключевые слова (модификаторы) signed и unsigned указывают, как интерпретируется нулевой бит объявляемой переменной, т.е., если указано ключевое слово unsigned, то нулевой бит интерпретируется как часть числа, в противном случае нулевой бит интерпретируется как знаковый.
Целочисленная величина int может быть short (короткой) или long (длинной).
Ключевое слово (модификатор) short ставится после ключевых слов signed или unsigned. Таким образом, различают следующие типы: signed short int, unsigned short int, signed long int, unsigned long int.
Переменная типа signed short int (знаковая короткая целая) может принимать значения от -32768 до +32767, unsigned short int (беззнаковая короткая целая) - от 0 до 65535. Под каждую из них отводится ровно по два байта памяти (16 бит).
При объявлении переменной типа signed short int ключевые слова signed и short могут быть пропущены, и такой тип переменной может быть объявлен просто int. Допускается и объявление этого типа одним ключевым словом short.