Локальная переменная
В программировании локальной переменной называют переменную, объявленную внутри блока кода. Область видимости локальной переменной начинается в точке её объявления и заканчивается в конце этого блока[1][2]. Например, в языке Си локальными являются переменные объявленные внутри функции или блока (в Си, блоки ограничиваются фигурными скобками { и })[3].
Существуют языки программирования, которые позволяют создавать локальные переменные только в теле функции (JavaScript)[4], а переменные объявленные внутри блоков добавляются в область видимости функции.
Содержание
Организация в памяти
Локальные переменные хранятся в стеке вызовов в большинстве языков[5]. Это означает, что если функция рекурсивно вызывает сама себя, то переменные каждый раз создаются заново и им выделяется персональная память, а не запись в одно и то же место.
Ограничения
Локальная переменная ограничивается только размером памяти выделенной операционной системой или компьютером под стек.
Алгол–подобные языки позволяют устраивать сколь угодно большую вложенность блоков и в каждом будут свои локальные переменные.
Область применения
Локальные переменные делают возможной рекурсию[6].
Переменные локальной области видимости используются, чтобы избежать проблем с побочными эффектами, которые могут произойти с глобальными переменными.
Языки программирования, которые используют вызов по значению, выделяют каждой подпрограмме локальную область видимости из локальных переменных с локальной копией аргументов переданных ей.
Локальной переменной является любой параметр функции(например, в языке Си), что не использует ссылок или указателей.
Статические локальные переменные
Статические переменные — это особый тип локальных переменных, доступен во многих популярных языках(включая c/c++, Visual Basic, VB.NET), суть его заключается в том, что эта переменная сохраняет в себе значение в каждом вызове функции. И в каждом вызове она будет ровно такой, какой была при закрытии тела этой функции до этого[7].
local
в Perl
Perl имеет ключевое слово, local
, для «локализации» переменных, но в этом случае, local
означает не то, что большинство людей ожидает от него. [2] Оно создаёт временную переменную с ограниченным временем жизни, но находящуюся в глобальном пространстве имён. Это позволяет видеть данную переменную в любой функции, вызванной из данного блока.
Для создания лексических переменных, которые больше похожи на автоматические переменные, используйте оператор my
.
Чтобы понять, как это работает рассмотрим следующий код:
$a = 1;
sub f()
{
local $a;
$a = 2;
g();
}
sub g()
{
print "$a\n";
}
g();
f();
g();
Результат:
1 2 1
это происходит с именем глобальной переменной $a
, которое начинает указывать на новую временную переменную, созданную в функции f()
, но глобальное значение восстанавливается при выходе из f()
.
Используя my
в этом случае вместо local
вывело бы 1 три раза, так как в этом случае переменная $a
действительно являлась бы локальной для функции f()
и не видели g()
.
По этой причине многие считают, что оператор local
должен иметь другое название, например save
. [5]
Локальные переменные в Ruby
Руби как язык был вдохновлен также Perl, но в этом случае, запись была сделана проще: имя глобальной переменной должно предшествовать знак $, например, $ имя_переменной, в то время как локальная переменная имеет не просто знак $ перед её имя, как variable_name (в то время как в Perl все скалярные значения имеют $ спереди).
Пример
#include <stdio.h>
int a = 0; // глобальная переменная
int main()
{
printf("%d", a); // будет выведено число 0
{
int a = 1; // объявлена локальная переменная а, глобальная переменная a не видна
printf("%d", a); // будет выведено число 1
{
int a = 2; // еще локальная переменная в блоке, глобальная переменная a не видна, не видна и предыдущая локальная переменная
printf("%d", a); // будет выведено число 2
}
}
}
Выдаст:
012
Напишите отзыв о статье "Локальная переменная"
Примечания
- ↑ [cpp.com.ru/shildt_spr_po_c/02/0204.html Локальные переменные]. Проверено 26 февраля 2013. [www.webcitation.org/6F6TOBQsZ Архивировано из первоисточника 14 марта 2013].
- ↑ [www.opennet.ru/docs/RUS/bash_scripting_guide/x12644.html Пример 22-8. Область видимости локальных переменных]. Проверено 26 февраля 2013. [www.webcitation.org/6F6TQ0Vi8 Архивировано из первоисточника 14 марта 2013].
- ↑ Альфред Ахо, Моника Лам, Рави Сети, Джеффри Ульман. 1.6.3 Статическая область видимости и блочная структура // Компиляторы: принципы, технологии и инструменты = Compilers: Principles, Techniques, and Tools. — 2-е изд. — Вильямс, 2008. — С. 62. — 1184 с. — ISBN 978-5-8459-1349-4.
- ↑ [habrahabr.ru/post/78991/ Область видимости переменной в Javascript (ликбез)]. — «...в Javascript область видимости переменной ограничивается только функциями, а не блоками...» Проверено 26 февраля 2013. [www.webcitation.org/6F6TRmlJc Архивировано из первоисточника 14 марта 2013].
- ↑ [cpp.com.ru/shildt_spr_po_c/02/0204.html Локальные переменные]. — «По умолчанию локальные переменные хранятся в стеке.» Проверено 26 февраля 2013. [www.webcitation.org/6F6TOBQsZ Архивировано из первоисточника 14 марта 2013].
- ↑ [www.opennet.ru/docs/RUS/bash_scripting_guide/x12644.html 22.2.1. Локальные переменные делают возможной рекурсию.]. Проверено 26 февраля 2013. [www.webcitation.org/6F6TQ0Vi8 Архивировано из первоисточника 14 марта 2013].
- ↑ [www.vedikhin.ru/2006/07/variables-2.html Статические переменные]. Проверено 26 февраля 2013. [www.webcitation.org/6F6Y4YLUN Архивировано из первоисточника 14 марта 2013].
Отрывок, характеризующий Локальная переменная
Князь, видимо, понял, и понял, как и на вечере у Annette Шерер, что от Анны Михайловны трудно отделаться.– Не было бы тяжело ему это свидание, chere Анна Михайловна, – сказал он. – Подождем до вечера, доктора обещали кризис.
– Но нельзя ждать, князь, в эти минуты. Pensez, il у va du salut de son ame… Ah! c'est terrible, les devoirs d'un chretien… [Подумайте, дело идет о спасения его души! Ах! это ужасно, долг христианина…]
Из внутренних комнат отворилась дверь, и вошла одна из княжен племянниц графа, с угрюмым и холодным лицом и поразительно несоразмерною по ногам длинною талией.
Князь Василий обернулся к ней.
– Ну, что он?
– Всё то же. И как вы хотите, этот шум… – сказала княжна, оглядывая Анну Михайловну, как незнакомую.
– Ah, chere, je ne vous reconnaissais pas, [Ах, милая, я не узнала вас,] – с счастливою улыбкой сказала Анна Михайловна, легкою иноходью подходя к племяннице графа. – Je viens d'arriver et je suis a vous pour vous aider a soigner mon oncle . J`imagine, combien vous avez souffert, [Я приехала помогать вам ходить за дядюшкой. Воображаю, как вы настрадались,] – прибавила она, с участием закатывая глаза.
Княжна ничего не ответила, даже не улыбнулась и тотчас же вышла. Анна Михайловна сняла перчатки и в завоеванной позиции расположилась на кресле, пригласив князя Василья сесть подле себя.
– Борис! – сказала она сыну и улыбнулась, – я пройду к графу, к дяде, а ты поди к Пьеру, mon ami, покаместь, да не забудь передать ему приглашение от Ростовых. Они зовут его обедать. Я думаю, он не поедет? – обратилась она к князю.
– Напротив, – сказал князь, видимо сделавшийся не в духе. – Je serais tres content si vous me debarrassez de ce jeune homme… [Я был бы очень рад, если бы вы меня избавили от этого молодого человека…] Сидит тут. Граф ни разу не спросил про него.
Он пожал плечами. Официант повел молодого человека вниз и вверх по другой лестнице к Петру Кирилловичу.
Пьер так и не успел выбрать себе карьеры в Петербурге и, действительно, был выслан в Москву за буйство. История, которую рассказывали у графа Ростова, была справедлива. Пьер участвовал в связываньи квартального с медведем. Он приехал несколько дней тому назад и остановился, как всегда, в доме своего отца. Хотя он и предполагал, что история его уже известна в Москве, и что дамы, окружающие его отца, всегда недоброжелательные к нему, воспользуются этим случаем, чтобы раздражить графа, он всё таки в день приезда пошел на половину отца. Войдя в гостиную, обычное местопребывание княжен, он поздоровался с дамами, сидевшими за пяльцами и за книгой, которую вслух читала одна из них. Их было три. Старшая, чистоплотная, с длинною талией, строгая девица, та самая, которая выходила к Анне Михайловне, читала; младшие, обе румяные и хорошенькие, отличавшиеся друг от друга только тем, что у одной была родинка над губой, очень красившая ее, шили в пяльцах. Пьер был встречен как мертвец или зачумленный. Старшая княжна прервала чтение и молча посмотрела на него испуганными глазами; младшая, без родинки, приняла точно такое же выражение; самая меньшая, с родинкой, веселого и смешливого характера, нагнулась к пяльцам, чтобы скрыть улыбку, вызванную, вероятно, предстоящею сценой, забавность которой она предвидела. Она притянула вниз шерстинку и нагнулась, будто разбирая узоры и едва удерживаясь от смеха.
– Bonjour, ma cousine, – сказал Пьер. – Vous ne me гесоnnaissez pas? [Здравствуйте, кузина. Вы меня не узнаете?]
– Я слишком хорошо вас узнаю, слишком хорошо.
– Как здоровье графа? Могу я видеть его? – спросил Пьер неловко, как всегда, но не смущаясь.
– Граф страдает и физически и нравственно, и, кажется, вы позаботились о том, чтобы причинить ему побольше нравственных страданий.
– Могу я видеть графа? – повторил Пьер.
– Гм!.. Ежели вы хотите убить его, совсем убить, то можете видеть. Ольга, поди посмотри, готов ли бульон для дяденьки, скоро время, – прибавила она, показывая этим Пьеру, что они заняты и заняты успокоиваньем его отца, тогда как он, очевидно, занят только расстроиванием.
Ольга вышла. Пьер постоял, посмотрел на сестер и, поклонившись, сказал:
– Так я пойду к себе. Когда можно будет, вы мне скажите.
Он вышел, и звонкий, но негромкий смех сестры с родинкой послышался за ним.
На другой день приехал князь Василий и поместился в доме графа. Он призвал к себе Пьера и сказал ему:
– Mon cher, si vous vous conduisez ici, comme a Petersbourg, vous finirez tres mal; c'est tout ce que je vous dis. [Мой милый, если вы будете вести себя здесь, как в Петербурге, вы кончите очень дурно; больше мне нечего вам сказать.] Граф очень, очень болен: тебе совсем не надо его видеть.
С тех пор Пьера не тревожили, и он целый день проводил один наверху, в своей комнате.
В то время как Борис вошел к нему, Пьер ходил по своей комнате, изредка останавливаясь в углах, делая угрожающие жесты к стене, как будто пронзая невидимого врага шпагой, и строго взглядывая сверх очков и затем вновь начиная свою прогулку, проговаривая неясные слова, пожимая плечами и разводя руками.