Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
10 / 10 / 2
Регистрация: 01.02.2010
Сообщений: 317
1

static и глобальная видимость

30.04.2010, 23:06. Просмотров 5129. Ответов 27
Метки нет (Все метки)

прочитал что если писать static int a = 5; то a будет видно ото всюду но оказалосбь это не так...

C++
1
2
3
4
5
6
7
8
9
10
void a();
 
int main() {
static int a = 5;
a();
}
 
void a() {
cout <<a;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.04.2010, 23:06
Ответы с готовыми решениями:

Глобальная видимость переменной в проекте
Как сделать, чтобы переменная была доступна в любой части проекта? Делаю так: //...

Чем отличается static local variable от static global variable?
привет вроде уже ребята объясняли, но что -то я не понял.... скажите пожалуйста,чем...

Глобальная переменная
Есть двумерный символьный массив ClusterBuf объявленный глобально. В него,в ходе выполнения...

Глобальная int
Всем привет столкнулся с задачей // это &quot;some.h&quot; using namespace std; int n = 0;

27
332 / 247 / 32
Регистрация: 13.12.2009
Сообщений: 589
30.04.2010, 23:36 2
Где вы такое прочитали?
Насколько я знаю - на статическую переменную действуют те же правила видимости что и на остальные.
0
Evg
Эксперт CАвтор FAQ
21145 / 8161 / 628
Регистрация: 30.03.2009
Сообщений: 22,467
Записей в блоге: 30
01.05.2010, 00:33 3
Цитата Сообщение от Krist_ALL Посмотреть сообщение
прочитал что если писать static int a = 5; то a будет видно ото всюду но оказалосбь это не так...
С точки зрения видимости переменная static ничем не отличается от остальных. Под "видимостью" подразумевается языковая видимость, а не межмодульная. Если переменная объявлена в локальном контексте (внутри функции или лексического блока), то "видна" одна только из этого блока, но при этом является глобальной переменной с временем жизни "вся программа"

С примерами объяснял здесь Отличие static от объявление переменных ДО функции main
1
4849 / 3270 / 466
Регистрация: 10.12.2008
Сообщений: 10,569
01.05.2010, 08:03 4
Цитата Сообщение от Krist_ALL
прочитал что если писать static int a = 5; то a будет видно ото всюду
`a' будет видно только в блоке, а значение `a' будет видно отовсюду
поэтому, чтобы получить доступ к этому значению, нужно из функции вернуть адрес этой переменной

если static глобальная, её действие меняется
0
Evg
Эксперт CАвтор FAQ
21145 / 8161 / 628
Регистрация: 30.03.2009
Сообщений: 22,467
Записей в блоге: 30
01.05.2010, 11:02 5
Цитата Сообщение от accept Посмотреть сообщение
если static глобальная, её действие меняется
static локальная и static глобальная вообще ничем не отличаются. Только областью видимости. "Её действие меняется" - неверно
0
Эксперт С++
2919 / 1268 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
01.05.2010, 12:54 6
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от Evg Посмотреть сообщение
..... но при этом является глобальной переменной с временем жизни "вся программа"
Это не вполне верно. В соответствии с точным смыслом Стандарта, время жизни такой переменной гарантированно начинается только с момента первого прохождения потока управления через ее объявление, и заканчивается с окончанием программы. То есть, если, например, статическая переменная объявлена в блоке (функции), а функция эта никогда не вызывается (поток управления никогда через нее не проходит), то эта переменная может никогда не "ожить" вообще :-)
2
Evg
Эксперт CАвтор FAQ
21145 / 8161 / 628
Регистрация: 30.03.2009
Сообщений: 22,467
Записей в блоге: 30
01.05.2010, 14:32 7
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от CheshireCat Посмотреть сообщение
Это не вполне верно. В соответствии с точным смыслом Стандарта, время жизни такой переменной гарантированно начинается только с момента первого прохождения потока управления через ее объявление, и заканчивается с окончанием программы. То есть, если, например, статическая переменная объявлена в блоке (функции), а функция эта никогда не вызывается (поток управления никогда через нее не проходит), то эта переменная может никогда не "ожить" вообще :-)
Опять как в вопросе про строго зафиксированный порядок выполнения операций, мы смотрим на проблему с разных колоколен. То, что сказал я - справедливо для Си. То, что сказал ты - справедливо для Си++. Для новичков всё-таки переведу твои слова на более понятный язык. Грубо говоря, если у нас в функции объявлена переменная типа класс, то в случае, если мы функцию ни разу не вызвали, то конструктор (и, соответственно, деструктор) для этой переменной не будут вызваны вообще. А если в функцию (или лексический блок) заходили, то при первом попадании в область видимости объекта будет вызван конструктор. С этой позиции разница между Си и Си++ в том, что в Си есть только статическая инициализация, а в Си++ есть ещё и динамическая: компилятор обеспечивает вызов конструкторов для всех переменных с глобальным временем жизни.
2
Эксперт С++
2919 / 1268 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
01.05.2010, 22:03 8
Вывернулся таки, хитрец! :-) Вот за что приятно с тобой дискутировать - так это за полностью корректные и спокойные контрагрументы.
Хорошо, поправка (уточнение) принята. Полагаю, отныне консенсус.
0
1 / 1 / 0
Регистрация: 05.03.2010
Сообщений: 8
01.05.2010, 22:18 9
Просто время жизни ограничивается с момента объявления до конца работы программы,
т.е. если к примеру она( переменная) объявляется в какой-то функции, с ней производятся операции,
при последующем вызове этой ф-и она будет иметь то же значение, что имела при завершении работы ф-и в прошлый раз: что-то типа счетчика, короче.
0
Evg
Эксперт CАвтор FAQ
21145 / 8161 / 628
Регистрация: 30.03.2009
Сообщений: 22,467
Записей в блоге: 30
01.05.2010, 23:17 10
Цитата Сообщение от CheshireCat Посмотреть сообщение
Вывернулся таки, хитрец!
Я не то чтоб выворачивался, я просто признал, что облажался (хотя полсле прочтения и вправду выглядит, как будто бы вывернулся). Просто я на Си программирую и у меня мышление на Си завязано. А потому в таких вопросах попросту забываю, что в Си++ есть много различий
0
4849 / 3270 / 466
Регистрация: 10.12.2008
Сообщений: 10,569
02.05.2010, 08:07 11
Цитата Сообщение от Evg
static локальная и static глобальная вообще ничем не отличаются. Только областью видимости. "Её действие меняется" - неверно
глобальная переменная уже статическая и слово static используется для такой переменной для другой цели
0
Evg
Эксперт CАвтор FAQ
21145 / 8161 / 628
Регистрация: 30.03.2009
Сообщений: 22,467
Записей в блоге: 30
02.05.2010, 10:05 12
Цитата Сообщение от accept Посмотреть сообщение
глобальная переменная уже статическая и слово static используется для такой переменной для другой цели
Тогда поясни, что означала фраза

Цитата Сообщение от accept Посмотреть сообщение
если static глобальная, её действие меняется
0
4849 / 3270 / 466
Регистрация: 10.12.2008
Сообщений: 10,569
03.05.2010, 02:17 13
тогда static устанавливает для переменной внутреннее связывание, для функции это также работает, что даёт возможность закрывать данное имя в еденице трансляции (файле .c)
а это, в свою очередь, даёт возможность иметь в программе функции и переменные с одинаковыми именами, которые действуют в пределах своих едениц трансляции
0
Evg
Эксперт CАвтор FAQ
21145 / 8161 / 628
Регистрация: 30.03.2009
Сообщений: 22,467
Записей в блоге: 30
03.05.2010, 10:20 14
accept, всё, что ты написал, в равной степени относится к static'у внутри функции. Модуль - это такая же область видимости, как и функция или лексический блок. Разве что явных фигурных скобок нет. Т.е. мысль из поста #4 в равной степени распространяется на все static'и
0
4849 / 3270 / 466
Регистрация: 10.12.2008
Сообщений: 10,569
03.05.2010, 10:38 15
Цитата Сообщение от Evg
accept, всё, что ты написал, в равной степени относится к static'у внутри функции. Модуль - это такая же область видимости, как и функция или лексический блок.
объявив переменную в модуле, её область видимости не будет распространяться только на этот модуль, если бы это было так, то static для глобальных переменных не стали бы делать (зачем делать то, что и так само по себе работает)
0
Evg
Эксперт CАвтор FAQ
21145 / 8161 / 628
Регистрация: 30.03.2009
Сообщений: 22,467
Записей в блоге: 30
03.05.2010, 10:51 16
Цитата Сообщение от accept Посмотреть сообщение
объявив переменную в модуле, её область видимости не будет распространяться только на этот модуль
Если выделенное жирным удалить, то будет верно. А в том виде, в которым ты написал - нет
0
4849 / 3270 / 466
Регистрация: 10.12.2008
Сообщений: 10,569
03.05.2010, 11:45 17
Цитата Сообщение от Evg
Если выделенное жирным удалить, то будет верно.
открой словарь, слово буквоед посмотри
0
Evg
Эксперт CАвтор FAQ
21145 / 8161 / 628
Регистрация: 30.03.2009
Сообщений: 22,467
Записей в блоге: 30
03.05.2010, 12:01 18
accept, я не занимаюсь буквоедством, я просто пытаюсь понять, что ты сказал в 4-м посте. Если в 15-м посте наличие "не" было опечаткой, то так бы и сказал.
0
19 / 18 / 1
Регистрация: 10.01.2017
Сообщений: 932
19.07.2020, 22:01 19
Цитата Сообщение от Evg Посмотреть сообщение
С точки зрения видимости переменная static ничем не отличается от остальных. Под "видимостью" подразумевается языковая видимость, а не межмодульная. Если переменная объявлена в локальном контексте (внутри функции или лексического блока), то "видна" одна только из этого блока, но при этом является глобальной переменной с временем жизни "вся программа"
А вот зачем так сделали ? Если статическая глобальная переменная нужна только при вызове функции, то при завершении функции, когда она уже никому не видна и не нужна, зачем ее оставлять ?
0
Don't worry, be happy
16921 / 9797 / 1887
Регистрация: 27.09.2012
Сообщений: 24,296
Записей в блоге: 2
19.07.2020, 22:10 20
Optimus11, теме десять лет, если что.
Цитата Сообщение от Optimus11 Посмотреть сообщение
уже никому не видна и не нужна, зачем ее оставлять ?
Значит нужна, раз нужно оставить.
Тривиальный пример - посчитай количество вызовов функции.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.07.2020, 22:10

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

Глобальная переменная
Надо сделать глобальную переменную которая будет видна во всех файлах .cpp Непонятно где ее...

Глобальная переменная
Никогда с таким не сталкивался... В общем: Надо обьявить глобальный масив в одной функции, но...

Глобальная переменная
#include &quot;stdafx.h&quot; #include &quot;locale&quot; #include &quot;iostream&quot; #include &quot;conio.h&quot; using...

Глобальная перезагрузка операторов
Есть код: template&lt; class Value &gt; class MyClass { Value value_; }; template&lt; class...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.