10 / 10 / 2
Регистрация: 01.02.2010
Сообщений: 317
|
||||||
1 | ||||||
static и глобальная видимость30.04.2010, 23:06. Просмотров 5129. Ответов 27
Метки нет Все метки)
(
прочитал что если писать static int a = 5; то a будет видно ото всюду но оказалосбь это не так...
0
|
|
30.04.2010, 23:06 | |
Глобальная видимость переменной в проекте
Глобальная переменная Глобальная int |
|
332 / 247 / 32
Регистрация: 13.12.2009
Сообщений: 589
|
|
30.04.2010, 23:36 | 2 |
Где вы такое прочитали?
Насколько я знаю - на статическую переменную действуют те же правила видимости что и на остальные.
0
|
![]() ![]() |
|
01.05.2010, 00:33 | 3 |
С точки зрения видимости переменная static ничем не отличается от остальных. Под "видимостью" подразумевается языковая видимость, а не межмодульная. Если переменная объявлена в локальном контексте (внутри функции или лексического блока), то "видна" одна только из этого блока, но при этом является глобальной переменной с временем жизни "вся программа"
С примерами объяснял здесь Отличие static от объявление переменных ДО функции main
1
|
4849 / 3270 / 466
Регистрация: 10.12.2008
Сообщений: 10,569
|
|
01.05.2010, 08:03 | 4 |
![]() поэтому, чтобы получить доступ к этому значению, нужно из функции вернуть адрес этой переменной если static глобальная, её действие меняется
0
|
![]() 2919 / 1268 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
|
01.05.2010, 12:54 | 6 |
![]() Решение
Это не вполне верно. В соответствии с точным смыслом Стандарта, время жизни такой переменной гарантированно начинается только с момента первого прохождения потока управления через ее объявление, и заканчивается с окончанием программы. То есть, если, например, статическая переменная объявлена в блоке (функции), а функция эта никогда не вызывается (поток управления никогда через нее не проходит), то эта переменная может никогда не "ожить" вообще :-)
2
|
![]() ![]() |
|
01.05.2010, 14:32 | 7 |
![]() Решение
Опять как в вопросе про строго зафиксированный порядок выполнения операций, мы смотрим на проблему с разных колоколен. То, что сказал я - справедливо для Си. То, что сказал ты - справедливо для Си++. Для новичков всё-таки переведу твои слова на более понятный язык. Грубо говоря, если у нас в функции объявлена переменная типа класс, то в случае, если мы функцию ни разу не вызвали, то конструктор (и, соответственно, деструктор) для этой переменной не будут вызваны вообще. А если в функцию (или лексический блок) заходили, то при первом попадании в область видимости объекта будет вызван конструктор. С этой позиции разница между Си и Си++ в том, что в Си есть только статическая инициализация, а в Си++ есть ещё и динамическая: компилятор обеспечивает вызов конструкторов для всех переменных с глобальным временем жизни.
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
|
![]() ![]() |
|
01.05.2010, 23:17 | 10 |
Я не то чтоб выворачивался, я просто признал, что облажался (хотя полсле прочтения и вправду выглядит, как будто бы вывернулся). Просто я на Си программирую и у меня мышление на Си завязано. А потому в таких вопросах попросту забываю, что в Си++ есть много различий
0
|
4849 / 3270 / 466
Регистрация: 10.12.2008
Сообщений: 10,569
|
|
03.05.2010, 02:17 | 13 |
тогда static устанавливает для переменной внутреннее связывание, для функции это также работает, что даёт возможность закрывать данное имя в еденице трансляции (файле .c)
а это, в свою очередь, даёт возможность иметь в программе функции и переменные с одинаковыми именами, которые действуют в пределах своих едениц трансляции
0
|
![]() ![]() |
|
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 |
![]()
0
|
19 / 18 / 1
Регистрация: 10.01.2017
Сообщений: 932
|
|
19.07.2020, 22:01 | 19 |
А вот зачем так сделали ? Если статическая глобальная переменная нужна только при вызове функции, то при завершении функции, когда она уже никому не видна и не нужна, зачем ее оставлять ?
0
|
Don't worry, be happy
|
|
19.07.2020, 22:10 | 20 |
Optimus11, теме десять лет, если что.
![]() Значит нужна, раз нужно оставить. Тривиальный пример - посчитай количество вызовов функции.
1
|
19.07.2020, 22:10 | |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь. Глобальная переменная Глобальная переменная Глобальная переменная Глобальная перезагрузка операторов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |