Локальная переменная

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск
Пример локальной переменной в среде MS Visual Studio 2012

В программировании локальной переменной называют переменную, объявленную внутри блока кода. Область видимости локальной переменной начинается в точке её объявления и заканчивается в конце этого блока[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

Примечания[править | править исходный текст]

  1. Локальные переменные. Проверено 26 февраля 2013. Архивировано из первоисточника 14 марта 2013.
  2. Пример 22-8. Область видимости локальных переменных. Проверено 26 февраля 2013. Архивировано из первоисточника 14 марта 2013.
  3. Альфред Ахо, Моника Лам, Рави Сети, Джеффри Ульман 1.6.3 Статическая область видимости и блочная структура // Компиляторы: принципы, технологии и инструменты = Compilers: Principles, Techniques, and Tools. — 2-е изд. — Вильямс, 2008. — С. 62. — 1184 с. — ISBN 978-5-8459-1349-4
  4. Область видимости переменной в Javascript (ликбез). — «...в Javascript область видимости переменной ограничивается только функциями, а не блоками...»  Проверено 26 февраля 2013. Архивировано из первоисточника 14 марта 2013.
  5. Локальные переменные. — «По умолчанию локальные переменные хранятся в стеке.»  Проверено 26 февраля 2013. Архивировано из первоисточника 14 марта 2013.
  6. 22.2.1. Локальные переменные делают возможной рекурсию.. Проверено 26 февраля 2013. Архивировано из первоисточника 14 марта 2013.
  7. Статические переменные. Проверено 26 февраля 2013. Архивировано из первоисточника 14 марта 2013.