3 / 3 / 1
Регистрация: 15.01.2016
Сообщений: 34
1

Нюансы объявления переменных

16.04.2017, 03:43. Показов 3102. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Есть несколько моментов, касающихся объявления переменных, которые пока не вполне понятны:

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
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.04.2017, 03:43
Ответы с готовыми решениями:

Нюансы объявления класса
Господа cpp-программисты. Расскажите, пожалуйста, как вы объявляете классы в своих проектах. ...

Что за объявления переменных?
День добрый! Скачал библиотеку, а там в объявлении класса: private: ...

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

Что означают эти объявления переменных?
Я не знаю как это понимать... В условии задания почему-то тип данных указан только для первой...

7
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
16.04.2017, 04:43 2
Цитата Сообщение от batos Посмотреть сообщение
если эта переменная каждый раз при обращении к функции объявляется и инициализируется
Область видимости и время жизни - не одно и то же.
Инициализируются статические переменные один раз (члены класса - перед входом в main(), внутри функции - когда поток управления пройдет через них в первый раз)
1
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
16.04.2017, 05:19 3
Лучший ответ Сообщение было отмечено batos как решение

Решение

Цитата Сообщение от batos Посмотреть сообщение
Или я что-то не так понял, или из нижеописанных правил получается, что по сути они будут работать одинаково.
То, что объявлено в main(), и видимо только в main().
Цитата Сообщение от batos Посмотреть сообщение
2. Переменная, объявленная или определенная локально, видима от точки объявления или определения до конца текущего блока. Такая переменная называется локальной.
В отличие от этого:
Цитата Сообщение от batos Посмотреть сообщение
1. Переменная, объявленная или определенная глобально, видима от точки объявления или определения до конца исходного файла. Можно сделать переменную видимой и в других исходных файлах, для чего в этих файлах следует ее объявить с классом памяти extern.
Добавлено через 8 минут
Цитата Сообщение от batos Посмотреть сообщение
Собственно, вопрос: если эта переменная каждый раз при обращении к функции объявляется и инициализируется, как показано в примере, то каким образом тогда можно "сохранить значение переменной при выходе из блока и использовать его при повторном входе в блок", как это указано в описании?
C++
1
2
3
4
5
6
7
8
9
10
11
12
void f()
{
    static int n = 3; // один раз
    cout << n << ' ';
    ++n;
}
 
int main()
{
    for (int i = 0; i < 3; ++i) // выведет: 3 4 5
        f();
}
Добавлено через 4 минуты
Цитата Сообщение от batos Посмотреть сообщение
Такая переменная имеет глобальное время жизни
Это противоречит такому предположению:
Цитата Сообщение от batos Посмотреть сообщение
если эта переменная каждый раз при обращении к функции объявляется и инициализируется
Если у переменой глобальное время жизни (время жизни до окончания программы), то она не будет объвляться и инициализироваться больше одного раза, в этом и есть суть глобальности времени жизни.
1
3 / 3 / 1
Регистрация: 15.01.2016
Сообщений: 34
16.04.2017, 05:19  [ТС] 4
Всё, со статическими понятно, спасибо.

Цитата Сообщение от nd2 Посмотреть сообщение
То, что объявлено в main(), и видимо только в main().
Т.е. эти переменные уже не будет видно в других функциях, которые вызываются из main() - а объявленные глобально будут видны во всех функциях?
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
16.04.2017, 05:29 5
Цитата Сообщение от batos Посмотреть сообщение
Т.е. эти переменные уже не будет видно в других функциях, которые вызываются из main()
main() такая же функция, как и другие. То, что объявляется внутри функции, за пределами функции не видно.
Цитата Сообщение от batos Посмотреть сообщение
а объявленные глобально будут видны во всех функциях?
Чтобы ответить, нужно знать, что имеется ввиду под "всеми функциями"? Можно ещё раз процитировать:
Цитата Сообщение от batos Посмотреть сообщение
1. Переменная, объявленная или определенная глобально, видима от точки объявления или определения до конца исходного файла. Можно сделать переменную видимой и в других исходных файлах, для чего в этих файлах следует ее объявить с классом памяти extern.
1
3 / 3 / 1
Регистрация: 15.01.2016
Сообщений: 34
16.04.2017, 05:30  [ТС] 6
Просто не очень понятно насчёт "текущего блока" - входят-ли в него функции, которые из него вызываются? Если да - то получается, что вся программа и есть блок функции main().
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
16.04.2017, 05:52 7
Цитата Сообщение от batos Посмотреть сообщение
Если да - то получается, что вся программа и есть блок функции main().
Нет. Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int global;
 
int f();
 
int main()
{
    // здесь видна global
    
    f(); // реализация f() находится в другом файле, там global не видна, но можно сделать, чтобы была видна (extern)
}
 
void f1()
{
    // здесь видна global
}
void f2()
{
    // здесь видна global
}
void f3()
{
     // здесь видна global
}
Добавлено через 14 минут
Цитата Сообщение от batos Посмотреть сообщение
Если переменная, объявленная внутри блока, имеет то же имя, что и переменная, объявленная в объемлющем блоке, то это разные переменные, и переменная из объемлющего блока во внутреннем блоке будет невидимой.
Это когда так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int global;
 
int f();
 
int main()
{
    int global; //локальная для main(), после этого глобальная в main() уже не видна
                    // но можно так получить доступ к глобальной ::global
    
    
}
void f1()
{
    int global; //локальная для f1(), после этого глобальная в f1() уже не видна
                    // но можно так получить доступ к глобальной ::global
}
1
3 / 3 / 1
Регистрация: 15.01.2016
Сообщений: 34
16.04.2017, 05:59  [ТС] 8
Ок, вроде всё понял, спасибо.
0
16.04.2017, 05:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.04.2017, 05:59
Помогаю со студенческими работами здесь

В чём отличие разных способов объявления переменных?
в чем отличие int a(2); от int a=2; И как писать правильней

Программа, которая содержит объявления следующих переменных
Приветствую, форумчане. Не так давно начал изучать C++ и в процессе обучения возник вопрос с...

Все виды(способы) объявления переменных, функций, классов, типов и т.п. на С++
Пишу обфускатор кода, написанного на С++ и появилась необходимость знания всевозможных способов...

Нюансы работы с лямбдами и область видимости переменных: как передать в лямбду переменную, а не её копию?
Очень нужна помощь, не выходит задать глобальную переменную для работы программы, возможно нужно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru