в чем отличие между локальной и глобальной переменной

Переменные

Переменная — это именованный участок памяти, в котором хранится значение, которое может быть изменено программой. Все переменные перед их использованием должны быть объявлены. Общая форма объявления [1] имеет такой вид:

Здесь тип означает один из базовых или объявленных программистом типов (если необходимо — с одним или несколькими спецификаторами), а список_переменных состоит из одного или более идентификаторов, разделенных запятыми. Ниже приведены примеры объявлений:

Необходимо помнить, что в С имя переменной никогда не определяет ее тип.

Где объявляются переменные


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

Локальные переменные существуют только во время выполнения программного блока, в котором они объявлены, создаются они при входе в блок, а разрушаются — при выходе из него. Более того, переменная, объявленная в одном блоке, не имеет никакого отношения к переменной с тем же именем, объявленной в другом блоке.

Чаще всего блоком программы, в котором объявлены локальные переменные, является функция. Рассмотрим, например, следующие две функции:

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

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

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

Объявление переменных внутри блока программы помогает избежать нежелательных побочных эффектов. Переменная не существует вне блока, в котором она объявлена, следовательно, «посторонний» участок программы не сможет случайно изменить ее значение.

Если имена переменных, объявленных во внутреннем и внешнем (по отношению к нему) блоках совпадают, то переменная внутреннего блока «прячет» (т.е. скрывает, делает невидимой) переменную внешнего блока. Рассмотрим следующий пример:

Результат выполнения программы следующий:

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

Однако в С99 (и в C++) эта функция вполне работоспособна, потому что в них локальная переменная может быть объявлена в любом месте внутри блока до ее первого использования.

Так как локальные переменные создаются и уничтожаются при каждом входе и выходе из блока, их значение теряется каждый раз, когда программа выходит из блока. Это необходимо учитывать при вызове функции. Локальная переменная создается при входе в функцию и разрушается при выходе из нее. Это значит, что локальная переменная не сохраняет свое значение в период между вызовами (однако можно дать указание компилятору сохранить значение локальной переменной, для этого нужно объявить ее с модификатором static ).

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

Локальные переменные можно инициализировать каким-либо заранее заданным значением. Это значение будет присвоено переменной каждый раз при входе в тот блок программы, в котором она объявлена. Например, следующая программа напечатает число 10 десять раз:

Формальные параметры функции

Если функция имеет аргументы, значит должны быть объявлены переменные, которые примут их значения. Эти переменные называются формальными параметрами функции. Внутри функции они фигурируют как обычные локальные переменные. Как показано в следующем фрагменте программы, они объявляются после имени функции внутри круглых скобок:

Внутри функции формальные параметры ничем не отличаются от обычных локальных переменных, единственное их отличие состоит в том, что при входе в функцию они получают значения аргументов. Можно, например, присваивать параметру какое-либо значение или использовать его в выражении. Необходимо помнить, что, как и локальные переменные, формальнее параметры тоже являются динамическими переменными и, следовательно, разрушаются при выходе из функции.

Глобальные переменные

В отличие от локальных, глобальные переменные видимы и могут использоваться в любом месте программы. Они сохраняют свое значение на протяжении всей работы программы. Чтобы создать глобальную переменную, ее необходимо объявить за пределами функции. Глобальная переменная может быть использована в любом выражении, независимо от того, в каком блоке это выражение используется.

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

[2] А в книгах по C++ переменной автоматического класса памяти (т.е. такой, что создается при входе в блок, где она объявлена, и уничтожается при выходе из него).

Источник

Переменные

Переменная — это именованный участок памяти, в котором хранится значение, которое может быть изменено программой. Все переменные перед их использованием должны быть объявлены. Общая форма объявления [1] имеет такой вид:

Здесь тип означает один из базовых или объявленных программистом типов (если необходимо — с одним или несколькими спецификаторами), а список_переменных состоит из одного или более идентификаторов, разделенных запятыми. Ниже приведены примеры объявлений:

Необходимо помнить, что в С имя переменной никогда не определяет ее тип.

Где объявляются переменные

Объявление переменных может быть расположено в трех местах: внутри функции, в определении параметров функции и вне всех функций. Это — места объявлений соответсвенно локальных, формальных параметров функций и глобальных переменных.

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

Локальные переменные существуют только во время выполнения программного блока, в котором они объявлены, создаются они при входе в блок, а разрушаются — при выходе из него. Более того, переменная, объявленная в одном блоке, не имеет никакого отношения к переменной с тем же именем, объявленной в другом блоке.

Чаще всего блоком программы, в котором объявлены локальные переменные, является функция. Рассмотрим, например, следующие две функции:

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

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

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

Объявление переменных внутри блока программы помогает избежать нежелательных побочных эффектов. Переменная не существует вне блока, в котором она объявлена, следовательно, «посторонний» участок программы не сможет случайно изменить ее значение.

Если имена переменных, объявленных во внутреннем и внешнем (по отношению к нему) блоках совпадают, то переменная внутреннего блока «прячет» (т.е. скрывает, делает невидимой) переменную внешнего блока. Рассмотрим следующий пример:

Результат выполнения программы следующий:

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

Однако в С99 (и в C++) эта функция вполне работоспособна, потому что в них локальная переменная может быть объявлена в любом месте внутри блока до ее первого использования.

Так как локальные переменные создаются и уничтожаются при каждом входе и выходе из блока, их значение теряется каждый раз, когда программа выходит из блока. Это необходимо учитывать при вызове функции. Локальная переменная создается при входе в функцию и разрушается при выходе из нее. Это значит, что локальная переменная не сохраняет свое значение в период между вызовами (однако можно дать указание компилятору сохранить значение локальной переменной, для этого нужно объявить ее с модификатором static ).

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

Локальные переменные можно инициализировать каким-либо заранее заданным значением. Это значение будет присвоено переменной каждый раз при входе в тот блок программы, в котором она объявлена. Например, следующая программа напечатает число 10 десять раз:

Формальные параметры функции

Если функция имеет аргументы, значит должны быть объявлены переменные, которые примут их значения. Эти переменные называются формальными параметрами функции. Внутри функции они фигурируют как обычные локальные переменные. Как показано в следующем фрагменте программы, они объявляются после имени функции внутри круглых скобок:

Внутри функции формальные параметры ничем не отличаются от обычных локальных переменных, единственное их отличие состоит в том, что при входе в функцию они получают значения аргументов. Можно, например, присваивать параметру какое-либо значение или использовать его в выражении. Необходимо помнить, что, как и локальные переменные, формальнее параметры тоже являются динамическими переменными и, следовательно, разрушаются при выходе из функции.

Глобальные переменные

В отличие от локальных, глобальные переменные видимы и могут использоваться в любом месте программы. Они сохраняют свое значение на протяжении всей работы программы. Чтобы создать глобальную переменную, ее необходимо объявить за пределами функции. Глобальная переменная может быть использована в любом выражении, независимо от того, в каком блоке это выражение используется.

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

Источник

Область видимости переменных в C++: локальные и глобальные переменные

Всем привет! Сегодня мы затронем тему, которую должны были изучить еще в самом начале пути изучения C++ — область видимости переменных. Мы разберем, что такое локальные и глобальные переменные.

Область видимости переменных в C++

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

В C++ существуют отдельные блоки, которые начинаются с открывающей скобки ( < ) и заканчиваются соответственно закрывающей скобкой ( >). Такими блоками являются циклы (for, while, do while) и функции.

Если переменная была создана в таком блоке, то ее областью видимости будет являться этот блок от его начала (от открывающей скобки — < ) и до его конца (до закрывающей скобки — >) включая все дочерние блоки созданные в этом блоке.

В примере ниже, программист ошибся с областью видимости:

А вот ошибки в строке 6 нет, поскольку второй цикл находится в первом цикле (является дочерним блоком первого цикла) и поэтому переменная b может спокойно там использоваться.

Глобальные переменные в C++

Глобальными переменными называются те переменные, которые были созданы вне тела какого-то блока. Их можно всегда использовать во всей вашей программе, вплоть до ее окончания работы. В примере ниже мы создали две глобальные переменные global и global_too и использовали их в функции summa :

Вот, что выведет данная программа:

Как видите глобальные переменные видны везде. В нашем примере внутри функции summa мы не создавали ни какие переменные, мы лишь использовали две глобальные переменные, которые были созданы раньше.

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

Локальные переменные — это переменные созданные в блоках. Областью видимости таких переменных является блоки ( и все их дочерние ), а также их область видимости не распространяется на другие блоки. Как ни как, но эти переменные созданы в отдельных блоках.

Из этого можно сделать вывод: у нас есть возможность создавать переменные с одинаковыми именами, но в разных блоках (или другими словами, чтобы их область видимости не совпадала друг с другом).

Нужно запомнить! Если вы создали локальную переменную, то вы должны понимать, что использование ее в других блоках будет невозможным.

Глобальная переменная уступает локальной

Если мы создадим глобальную переменную и с таким же именем локальную, то получится, что там где была создана локальная переменная будет использоваться именно локальная переменная, а не глобальная. Так как локальная переменная считается по приоритету выше глобальной. Давайте разберем, как это работает на примере ниже:

А вот, если мы вызовем функцию sait_message то результатом будет:

Вот так глобальная переменная уступает локальной!

Мы советуем вам не создавать переменные с одинаковыми именами, поскольку в будущем вам будет тяжело разобраться в коде, если там будут присутствовать одинаковые переменные.

Глобальный оператор разрешения

В случае создания двух переменных с одинаковым именем (одна из которых является глобальной, а другая локальной) при использовании в блоке, в котором была объявлена локальная переменная, можно использовать и глобальную переменную. Для ее использования нужно всего лишь применить глобальный оператор разрешения.

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

Чтобы использовать глобальный оператор разрешения нужно применять данную конструкцию:

Источник

BestProg

Содержание

Поиск на других ресурсах:

1. Что называется переменной?

Переменная (variable) в программе – это именованная ячейка памяти, которая предназначена для сохранения некоторого значения. Сохраненное значение может быть результатом вычисления выражения, числовой или строчной константой и т.д.

При разработке программы, программист по собственному усмотрению дает имена переменным. Имя переменной есть именем идентификатора. Это имя должно соответствовать синтаксису языка C/C++. Более подробно об именах переменных описывается в теме:

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

Желательно, чтобы имя переменной отвечало ее предназначению в программе. Например, если переменная используется для сохранения некоторого максимального значения, тогда ее имя может быть Max (например).

В языке C/C++ каждая переменная должна иметь собственный тип. Более подробно о типах данных C/C++ описывается в статье:

2. Какой общий вид описания переменной в C/C++?

Общий вид описания переменной:

Переменная может иметь до 1024 символов любого имени.

Пример объявления переменных разных типов.

3. В каких местах программы можно объявлять переменные? Как классифицируются переменные в зависимости от места объявления в программе?

Переменные могут быть объявлены:

В зависимости от места объявления в программе, переменные классифицируются следующим образом:

4. Что такое локальные переменные? В каких местах программы объявляются локальные переменные?

Локальные переменные – это переменные, которые объявлены (описаны) внутри функций. Доступ к таким переменным имеют только операторы, которые используются в теле функции.

Локальные переменные создаются в момент вызова функции. Как только выполнение функции завершается, локальные переменные уничтожаются.

5. Что означает термин «разрушение переменной»?

Локальные переменные создаются в момент вызова функции. Как только выполнение функции завершается, локальные переменные разрушаются. Термин «разрушение переменной» означает: разрушение переменной в оперативной памяти после завершения функции, в которой эта переменная была объявлена.

6. Что означает термин «формальный параметр»?

Формальный параметр – это переменная, которая есть входным параметром функции. При вызове функции, ей передаются аргументы. Значение этих аргументов копируются в формальные параметры функции в порядке их вызова.

7. Что такое глобальные переменные? Какое отличие между глобальными и локальными переменными?

Глобальная переменная – это переменная, доступ к которой имеют все функции в программе. Глобальные переменные сохраняют свои значения на протяжении всего времени выполнения программы. Это время называется временем жизни глобальной переменной.

Глобальная переменная объявляется за пределами всех функций.

8. Примеры объявления переменных разных типов
9. Как выделяется память для переменных целочисленных типов?

При объявлении переменной для нее выделяется память. Размер памяти, которая выделяется, зависит от типа переменной. Размер выделенной памяти влияет на диапазон значений, которые может принимать переменная.

Для переменных целых типов выделяется память соответственно нижеследующим таблицам.

Для 16-разрядной среды.

(аналогичен типу int)

(аналогичен типу int)

(аналогичен типу unsigned int)

(аналогичен типу int)

-2 147 483 648 … 2 147 483 647

(аналогичен типу long int)

Для 32-разрядной среды.

ТипРазмер в битахДиапазон значений
int16-32768 … 32767
unsigned int160 … 65535
signed int16
long int32-2 147 483 648 … 2 147 483 647
unsigned long int320 … 4 294 967 295
signed long int32

-2 147 483 648 … 2 147 483 647

(аналогичен типу int)

-2 147 483 648 … 2 147 483 647

(аналогичен типу int)

(аналогичен типу unsigned int)

-2 147 483 648 … 2 147 483 647

(аналогичен типу signed int)

Диапазон значений для типа long long

Диапазон значений для типа unsigned long long

10. Как выделяется память для переменных типов с плавающей запятой?

Для типов с плавающей запятой таблица выделенной памяти для переменной имеет вид как показано ниже. Выделение памяти для переменных типов с плавающей запятой не зависит от того, какую разрядность имеет среда (16 или 32 разряда).

ТипРазмер в битахДиапазон значений
int32-2 147 483 648 … 2 147 483 647
unsigned int320 … 4 294 967 295
signed int32
short int16-32768 … 32767
unsigned short int160 … 65535
signed short int16-32768 … 32767
long int32
ТипРазмер в битахДиапазон значений
float323.4E-38 … 3.4E+38
double641.7E-308 … 1.7E+308
long double803.4E-4932 … 3.4E+4932
11. Как выделяется память для переменных символьных ( char ) типов?

Для переменных символьного типа независимо от среды (16 или 32 разряда) выделяется память на основе следующей таблицы.

ТипРазмер в битахДиапазон значений
char8-128 … 127
unsigned char80 … 255
signed char8-128 … 127
12. Что такое константы в языке программирования C++? Как объявить константу?

Константа – это есть переменная, которая не может изменять своего значения на протяжении всего времени выполнения программы. Значение константе присваивается при ее объявлении. Для объявления константы используется ключевое слово const.

Общий вид объявления константы

Примеры объявления констант.

С помощью операции расширения области видимости :: можно получить доступ не только к переменным, но и к константам и функциям.

Пример.

В примере продемонстрировано:

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *