Jump to content

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

В информатике локальная переменная — это переменная , имеющая локальную область видимости . Ссылка на локальную переменную в функции или блоке , в котором она объявлена, переопределяет то же имя переменной в более широкой области. В языках программирования, имеющих только два уровня видимости, локальные переменные противопоставляются глобальным переменным . С другой стороны, многие языки, производные от ALGOL, допускают любое количество вложенных уровней видимости, при этом частные переменные, функции, константы и типы скрыты внутри них либо с помощью вложенных блоков, либо вложенных функций . Локальные переменные имеют основополагающее значение для процедурного программирования и, в более общем смысле, модульного программирования : переменные локальной области используются, чтобы избежать проблем с побочными эффектами , которые могут возникнуть с глобальными переменными .

Локальные переменные могут иметь лексическую или динамическую область видимости , хотя лексическая (статическая) область видимости встречается гораздо чаще. При лексической области видимости (или лексической области видимости; также называемой статической областью видимости или статической областью видимости), если областью действия имени переменной является определенный блок, то ее областью действия является текст программы определения блока: внутри текста этого блока существует имя переменной и привязано к значению переменной, но вне текста этого блока имя переменной не существует. Напротив, при динамической области видимости (или динамической области видимости), если областью действия имени переменной является определенный блок, то ее областью действия является этот блок и все функции, транзитивно вызываемые этим блоком (за исключением случаев, когда они снова переопределяются другим объявлением); после завершения блока имя переменной не существует. Некоторые языки, такие как Perl и Common Lisp , позволяют программисту выбирать статическую или динамическую область видимости при определении или переопределении переменной. Примеры языков, использующих динамическую область видимости, включают Logo , Emacs lisp , а также языки оболочки bash , Dash и оболочку MirBSD Korn ( mksh ) «локальное» объявление. Большинство других языков предоставляют локальные переменные с лексической областью действия.

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

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

Статические локальные переменные

[ редактировать ]

Специальный тип локальной переменной, называемый статической локальной переменной, доступен во многих основных языках (включая C / C++ , Visual Basic , VB.NET и PHP ), который позволяет сохранять значение от одного вызова функции к другому – это — статическая переменная с локальной областью действия. В этом случае рекурсивные вызовы функции также имеют доступ к (единственной, статически выделенной ) переменной. Во всех вышеперечисленных языках статические переменные объявляются как таковые с помощью специального ключевого слова класса хранения (например, static).

Статические локальные переменные в глобальных функциях имеют такое же время жизни, как и статические глобальные переменные , поскольку их значение остается в памяти на протяжении всего срока службы программы. [1] но имеют область действия функции (а не глобальную), как и в случае с автоматическими локальными переменными.

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

Локальные переменные в Perl

[ редактировать ]

Perl поддерживает как динамические, так и локальные переменные с лексической областью. Ключевое слово local используется для определения локальных переменных с динамической областью действия, а my используется для локальных переменных с лексической областью. Поскольку динамическая область видимости сегодня менее распространена, документация Perl предупреждает, что « local это не то, что большинство людей считают «местным».». [2] Вместо этого local Ключевое слово дает временное значение с динамической областью глобальной (пакетной) переменной, которая сохраняется до конца охватывающего блока. Однако переменная видна любой функции, вызываемой из блока. [3] Чтобы создать локальные переменные с лексической областью действия, используйте команду my вместо этого оператор. [4]

Чтобы понять, как это работает, рассмотрим следующий код:

$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

[ редактировать ]

Ruby как язык также был вдохновлен Perl, но в данном случае обозначение было упрощено: имени глобальной переменной должен предшествовать знак $, например $variable_name, а у локальной переменной перед именем просто нет знака $, например variable_name (в то время как в Perl все скалярные значения имеют знак $ впереди). Обратите внимание, что Ruby предоставляет только встроенную поддержку локальных переменных со статической областью действия, таких как Perl. my, а не локальные переменные с динамической областью действия, такие как Perl local. Существует по крайней мере одна библиотека для Ruby, которая предоставляет переменные с динамической областью видимости. [6]

См. также

[ редактировать ]
  1. ^ «Текущий стандарт C» (PDF) .   (3,61 МБ) (по состоянию на 2009 г.) ). В частности, см. раздел 6.2.4 «Длительность хранения объектов», стр. 32.
  2. ^ perldoc.perl.org: локальный
  3. ^ perldoc.perl.org: perlsub: временные значения через local()
  4. ^ perldoc.perl.org: perlsub: частные переменные через my()
  5. ^ Рэндал Л. Шварц и Том Феникс (1 июля 2001 г.). Изучение Perl 3-го издания . О'РЕЙЛИ. пункт 4.7. ISBN  0-596-00132-0 .
  6. ^ Конрад Ирвин. «LSpace: динамическая область действия для Ruby». декабрь 2012 г. http://cirw.in/blog/lspace Проверено 16 октября 2013 г.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: d6a168e0996bb45659926a7096cf2b84__1700916780
URL1:https://arc.ask3.ru/arc/aa/d6/84/d6a168e0996bb45659926a7096cf2b84.html
Заголовок, (Title) документа по адресу, URL1:
Local variable - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)