- Переменные
- Работа
Переменные
В процессе работы любая программа не только использует константы, т.е. фиксированные значения, но и получает, изменяет и выводит данные различных типов, т.е. оперирует изменяющимися числами (как было сказано ранее, все данные, в конце концов, есть числа).
Изменяемые величины хранятся в ОЗУ, каждое отдельное число в отдельных ячейках. Для обозначения таких ячеек введена особая лексема – переменная.
Переменная – это идентификатор, обозначающий строго определенную область памяти, содержащую данные конкретного типа. Для определения любых переменных не допускается использовать идентификаторы, совпадающие с ключевыми словами языка или уже определенными ранее (например, введенных программистом типов).
Из определения переменной следует ее неразрывная связь с одним из определенных типов, т.е. переменные могут быть типа char, int, float и т.д. В программе каждая переменная должна быть обязательно определена, т.е. описана. Описание переменной осу-
ществляется по следующему шаблону(1):
<тип> <список идентификаторов>;
Здесь тип – это один из ранее определенных типов, а список идентификаторов – это один или более идентификаторов, разделенных запятыми. Завершать определение должна традиционная точка с запятой. Запятая – это особый разделитель, используемый для разделения элементов списка, т.е. таких элементов, которые должны восприниматься компилятором как некая неделимая группа.
unsigned long var;
int a, b, c;
char ch;
Пример демонстрирует определение переменной var, имеющей тип «беззнаковое длинное целое», трех переменных a, b и с типа «целое число со знаком» и одну переменную ch типа «символ».
Встретив определение переменных, компилятор резервирует необходимое количество ячеек памяти, которые затем будут использованы в программе по усмотрению программиста. Использование неописанных переменных в программе не допускается. По умолчанию каждой из описанных переменных сразу присваивается нулевое значение – говорят «переменная проинициализирована значением по умолчанию» (инициализация по умолчанию характерна не для всех переменных, о чем будет сказано далее). Далее будет показано, как можно инициализировать переменные другими значениями.
Программист должен знать, что память для хранения переменных выделяется в порядке их описания, т.е. для вышеприведенного примера в ОЗУ сразу после 4-го байта переменной var будут следовать 2 байта переменной a и т.д. Порядок байтов, составляющих переменную, определяется платформой, для которой компилируется программа. Для микроконтроллеров AVR принято, что многобайтные переменные хранятся в памяти «от младшего байта к старшему», т.е. первым размещается младший байт (наименее значащие биты числа), а затем все более старшие, вплоть до последнего (наиболее значащие биты числа).
При описании переменных могут дополнительно использоваться ключевые слова static, register, extern и volatile. Эти слова могут располагаться как до определения типа переменной, так и после него, однако обязательно до указания идентификатора. Если переменная объявлена с использованием слова register, это означает, что компилятор поместит ее в один из доступных регистров микроконтроллера. Не стоит надеяться, что регистровые переменные каким-то образом помогут создать более быстродействующую программу: для большинства случаев результат будет скорее обратный, хотя в некоторых случаях положительный эффект может быть.
Ключевое слово volatile – очень важное. Дословно оно означает «изменяемая», что на первый взгляд излишне для переменной, само наименование которой означает изменение значения. Однако, дело тут в другом. Компилятор в процессе своей работы анализирует написанный программистом текст программы и старается убрать из него те части, которые явно не несут никакого смысла (подробнее об этом см. в главе «Об оптимизаторе программ»). В частности, компилятор может исключить все участки программы, которые обрабатывают переменные, не изменяющие (с точки зрения компилятора) значения. Разумеется, далеко не всегда это соответствует замыслам программиста. Ключевое слово volatile, использованное при объявлении переменной, укажет компилятору, что эта переменная все-таки изменяется, пусть даже и неизвестным компилятору способом. Можно считать, что volatile есть синоним слова «неприкосновенный», т.е. объявленную таким образом переменную нельзя трогать при оптимизации.
Назначение остальных ключевых слов будет рассмотрено далее.
- Здесь и далее, если иное не оговорено, используется традиционный формат описания шаблонов выражений: в угловых скобках указываются обязательные элементы, в квадратных – опциональные, все прочие символы вне скобок являются обязательными.