3 / 3 / 1
Регистрация: 15.01.2016
Сообщений: 34
|
|
1 | |
Нюансы объявления переменных16.04.2017, 03:43. Показов 3103. Ответов 7
Метки нет (Все метки)
Здравствуйте. Есть несколько моментов, касающихся объявления переменных, которые пока не вполне понятны:
1 - В чём заключается практическая разница между глобальными переменными, объявленными до начала программы, и локальными переменными функции main()? Или я что-то не так понял, или из нижеописанных правил получается, что по сути они будут работать одинаково. Кликните здесь для просмотра всего текста
Видимость переменных и функций в программе определяется следующими правилами.
1. Переменная, объявленная или определенная глобально, видима от точки объявления или определения до конца исходного файла. Можно сделать переменную видимой и в других исходных файлах, для чего в этих файлах следует ее объявить с классом памяти extern. 2. Переменная, объявленная или определенная локально, видима от точки объявления или определения до конца текущего блока. Такая переменная называется локальной. 3. Переменные из объемлющих блоков, включая переменные объявленные на глобальном уровне, видимы во внутренних блоках. Эту видимость называют вложенной. Если переменная, объявленная внутри блока, имеет то же имя, что и переменная, объявленная в объемлющем блоке, то это разные переменные, и переменная из объемлющего блока во внутреннем блоке будет невидимой. 2 - Встретил вот такое описание применения ststic переменных внутри функций: Кликните здесь для просмотра всего текста
Переменные, объявленные на внутреннем уровне со спецификатором класса памяти static, обеспечиваю возможность сохранить значение переменной при выходе из блока и использовать его при повторном входе в блок. Такая переменная имеет глобальное время жизни и область видимости внутри блока, в котором она объявлена. В отличие от переменных с классом auto, память для которых выделяется в стеке, для переменных с классом static память выделяется в сегменте данных, и поэтому их значение сохраняется при выходе из блока.
Пример: /* объявления переменной i на внутреннем уровне с классом памяти static. */ /* исходный файл file1.c */ main() { ... } fun1() { static int i=0; ... } /* исходный файл file2.c */ fun2() { static int i=0; ... } fun3() { static int i=0; ... } Собственно, вопрос: если эта переменная каждый раз при обращении к функции объявляется и инициализируется, как показано в примере, то каким образом тогда можно "сохранить значение переменной при выходе из блока и использовать его при повторном входе в блок", как это указано в описании?
0
|
16.04.2017, 03:43 | |
Ответы с готовыми решениями:
7
Нюансы объявления класса Что за объявления переменных? Проверка синтаксиса объявления переменных Что означают эти объявления переменных? |
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
|
16.04.2017, 04:43 | 2 |
Область видимости и время жизни - не одно и то же.
Инициализируются статические переменные один раз (члены класса - перед входом в main(), внутри функции - когда поток управления пройдет через них в первый раз)
1
|
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
|
||||||
16.04.2017, 05:19 | 3 | |||||
Сообщение было отмечено batos как решение
Решение
То, что объявлено в main(), и видимо только в main().
В отличие от этого: Добавлено через 8 минут
Это противоречит такому предположению: Если у переменой глобальное время жизни (время жизни до окончания программы), то она не будет объвляться и инициализироваться больше одного раза, в этом и есть суть глобальности времени жизни.
1
|
3 / 3 / 1
Регистрация: 15.01.2016
Сообщений: 34
|
|
16.04.2017, 05:19 [ТС] | 4 |
Всё, со статическими понятно, спасибо.
Т.е. эти переменные уже не будет видно в других функциях, которые вызываются из main() - а объявленные глобально будут видны во всех функциях?
0
|
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
|
|
16.04.2017, 05:29 | 5 |
main() такая же функция, как и другие. То, что объявляется внутри функции, за пределами функции не видно.
Чтобы ответить, нужно знать, что имеется ввиду под "всеми функциями"? Можно ещё раз процитировать:
1
|
3 / 3 / 1
Регистрация: 15.01.2016
Сообщений: 34
|
|
16.04.2017, 05:30 [ТС] | 6 |
Просто не очень понятно насчёт "текущего блока" - входят-ли в него функции, которые из него вызываются? Если да - то получается, что вся программа и есть блок функции main().
0
|
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
|
|||||||||||
16.04.2017, 05:52 | 7 | ||||||||||
Нет. Пример:
Это когда так:
1
|
3 / 3 / 1
Регистрация: 15.01.2016
Сообщений: 34
|
|
16.04.2017, 05:59 [ТС] | 8 |
Ок, вроде всё понял, спасибо.
0
|
16.04.2017, 05:59 | |
16.04.2017, 05:59 | |
Помогаю со студенческими работами здесь
8
В чём отличие разных способов объявления переменных? Программа, которая содержит объявления следующих переменных Все виды(способы) объявления переменных, функций, классов, типов и т.п. на С++ Нюансы работы с лямбдами и область видимости переменных: как передать в лямбду переменную, а не её копию? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |