Переменные и идентификаторы

Переменная — это ячейка памяти с уникальным именем (чтобы можно было на неё ссылаться без ошибок), способная хранить значения определенного типа. Данная способность обеспечивается тем, что компилятор резервирует под переменную ровно столько памяти, сколько под неё требуется в специальном внутреннем формате: каждый тип имеет размер и соответствующий формат хранения в памяти. Подробнее об этом — во второй части книги.

В принципе, для имен переменных, функций и многих других сущностей (которые предстоит изучить позднее) в программе имеется более строгое понятие — идентификатор. Идентификатор подчиняется нескольким правилам. В частности, он должен содержать только буквы латинского алфавита, цифры и символ подчеркивания, и не начинаться с цифры. Вот почему слово Greeting, выбранное в предыдущем параграфе для функции, этим требованиям удовлетворяет.

Сами значения переменной могут быть разными, меняться по ходу выполнения программы с помощью специальных инструкций.

Кроме типа и имени переменная характеризуется контекстом — областью в программе, где она определена и может использоваться без ошибок компилятора. Понять эту концепцию на первых порах и без подробных технических рассуждений, вероятно, будет проще на нашем примере.

Дело в том, что частным случаем переменной является параметр функции. Назначение параметра — передать внутрь функции некое значение. Отсюда становится очевидно, что фрагмент кода, где такая переменная существует, должен ограничиваться телом самой функции. Иными словами, параметр можно использовать во всех инструкциях внутри блока функции, но нельзя вовне. Если бы язык программирования позволял такие вольности, это стало бы источником множества ошибок из-за потенциальной возможности испортить содержимое внутренностей функции из произвольного, никак не связанного с ней, участка программы.

В любом случае, это слегка упрощенное определение переменной, достаточное для данной вводной части. Более тонкие нюансы мы рассмотрим позднее.

Итак, обобщим наши знания о переменных и параметрах: они должны иметь имя, тип и контекст. Первые две характеристики мы пишем в коде явным образом, последняя — вытекает из места определения.

Посмотрим, как можно определить параметр с номером часа в функции Greeting. Мы уже знаем нужный нам тип — int, а имя можно выбрать по смыслу — hour.

string Greeting(int hour)
{
  return "Hello, ";
}

Такая функция по-прежнему вернет "Hello, " вне зависимости от часа. Теперь необходимо добавить некие инструкции, которые выбирали бы различную возвращаемую строку на основе значения параметра hour. Напомним, вариантов "ответа" функции три: "Good morning", "Good day", "Good evening". Можно было бы предположить, что нам нужны 3 переменные для описания этих строк. Однако в подобных случаях гораздо удобнее воспользоваться массивом, который обеспечивает единообразный способ кодирования алгоритмов с доступом к элементам.