Переменные
Переменная – это место хранения данных. Она имеет имя, значение и тип. Например, данное объявление (называется декларацией):
int pin = 13;
создает переменную с именем pin
, значением 13
и типом int
.
Затем в программе имеется возможность обратиться к данной переменной через имя с целью работы с ее значением. Например, в утверждении:
pinMode(pin, OUTPUT);
имеется значение вывода (13), которое будет передаваться в функцию pinMode(). В данном случае нет необходимости использовать переменную. Утверждение может работать и в таком виде:
pinMode(13, OUTPUT);
Преимущество переменной заключается в том, что необходимо определить значение вывода однажды и потом использовать его многократно. В последствии при изменении вывода 13 на 12 достаточно будет поменять только одну строку в программном коде. Также можно использовать специальные имена для подчеркивания значения переменной (напр., программа, управляющая светодиодом RGB, может содержать переменные redPin, greenPin и bluePin).
Переменные имеют другие преимущества перед такими значениями как число. Имеется возможность изменить значение переменной, используя присвоение. Например:
pin = 12;
изменит значение переменной на число 12. В данном примере не определяется тип переменной, т.к. он не меняется операцией присвоения. Имя переменной постоянно связано с типом, меняется только значение. [1] Перед присвоением значения необходимо декларировать переменную. Присвоение значения переменной без ее декларации вызовет следующее сообщение: error: pin was not declared in this scope".
При присвоении одной переменной другой происходит копирование значения первой переменной во вторую. Изменение значение одной переменной не влияет на другую. Например, после записи:
int pin = 13; int pin2 = pin; pin = 12;
только pin имеет значение 12, а pin2 еще равен 13.
Что означает слово "scope" в сообщение об ошибке, приведенной выше? Оно относится к части программы, в которой переменная может использоваться - областе видимости. Область видимости определяется местом ее декларации. Например, имеется возможность использовать переменную во всей программе, если задекларировать ее в начале программного кода. Такие переменные называются глобальными. Например:
int pin = 13; void setup() { pinMode(pin, OUTPUT); } void loop() { digitalWrite(pin, HIGH); }
Из примера видно, что pin используется в обеих функциях setup() и loop(). Обе функции ссылаются на одну переменную, таким образом, изменение ее значения в одной функции повлияет на значение в другой:
int pin = 13; void setup() { pin = 12; pinMode(pin, OUTPUT); } void loop() { digitalWrite(pin, HIGH); }
Функции digitalWrite(), вызываемой из loop(), будет передано значение 12, т.к. оно было присвоено переменной в функции setup().
Если переменная используется только один раз в функции, то ее декларируют в данной части программного кода, ограниченной скобками функции. Например:
void setup() { int pin = 13; pinMode(pin, OUTPUT); digitalWrite(pin, HIGH); }
В данном примере переменная может использоваться только внутри функции setup(). При написании данного кода:
void loop() { digitalWrite(pin, LOW); // wrong: pin is not in scope here. }
будет выведено сообщение: «error: 'pin' was not declared in this scope». Данное сообщение будет выводиться, даже если вы задекларировали переменную где-то в программе, но пытаетесь ее использовать вне области видимости.
Почему не сделать все переменные глобальными? Если неизвестно где будет еще использоваться переменная, то почему ее надо ограничивать одной функцией? Когда переменная ограничена легче найти источник ее изменения. Если переменная глобальная, то ее значение может быть изменено в любом месте программного кода, что означает необходимость проследить ее изменение по всей программе. Например, когда переменная имеет некорректное значение, то гораздо легче найти причину если область видимости ограничена.
[1] В некоторых языках программирования, как Python, типы ассоциируются со значениями, а не с именами переменных. Таким образом, имеется возможность присвоит значение любого типа переменной. Это называется динамической типизацией.