Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 48, средняя оценка - 4.83
toxxin
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 118
#1

Отличие static от объявление переменных ДО функции main - C++

26.09.2009, 21:17. Просмотров 6514. Ответов 8
Метки нет (Все метки)

Может быть я не совсем точно выразился в заголовке. Интересует отличие объявление переменных ДО функции main и объявление через static. По моим ощущениям если объявлено через static, то переменная существует всегда(даже при выходе из блока где она использовалась). Но ведь если просто объявить переменные до функции main они также будут видны везде. Поясните в чем загвоздка.
Заранее спасибо.

P.S. Прошу прощения если вопрос поставлен не корректно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.09.2009, 21:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Отличие static от объявление переменных ДО функции main (C++):

Объясните пожалуйста объявление функции вне main - C++
#include <iostream> #include <string> bool poly(std::string str) { unsigned int k = str.length(); for(unsigned int i...

Шаблонный класс для работы с разными типами данных и объявление методов в main - C++
есть класс шаблонный, но не могу объявить методы в main и сделать длядругих типов :(когда делала через шаблонные функции, то программа...

Объявление переменных - C++
Пишу на VS2012. Перерыл кучу сайтов, но нигде не нашел, как объявить переменную в asm вставке? Добавлено через 53 минуты uuppp

объявление переменных - C++
вообщем есть задание которое не раз тут обсуждалось решалось и тд. суть не в этом. столкнулся с маленькой проблемой при оформлении каждого...

Объявление переменных. - C++
У меня есть два юнита с формами. В одном располагается TMainMenu, где я выбираю как производится ввод: из файла или с клавиатуры, и могу...

Объявление переменных - C++
Помогите с объявлением переменных, даны такие объявления: int m1; int *m2; int **m3; int m4; int *m5; int **m6; int (*m7); ...

8
Sekt
156 / 155 / 10
Регистрация: 29.04.2009
Сообщений: 637
26.09.2009, 21:39 #2
Переменные/функции будут видны без static но не в классах например.
1
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
26.09.2009, 21:46 #3
1. static-переменная действительно имеет статическое время жизни и "существует" всегда, как и переменная, объявленная "до" main (а та - именуется "глобальной"). Но вот область видимости static-переменной ограничена: от точки ее объявления до конца блока, в котором она объявлена.
2. второе различие заключается в моменте инициализации: если глобальные переменные гарантированно инициализируются к моменту первого использования единицы компиляции, в которой они объявлены, то для статической переменной гарантируется только то, что она будет инициализирована в тот момент, когда поток управления первый раз пройдет через точку ее объявления.

PS: переменная "существует" и "видима" - разные понятия. Почувствуй разницу!
1
toxxin
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 118
26.09.2009, 21:49  [ТС] #4
Т.е. если у меня прога на чистом СИ, и модуль всего один, то фактически разницы никакой... правильно??
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
26.09.2009, 21:55 #5
Нет, не правильно.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int x;
static double y = 2.0;
 
void foo()
{
    static int z = 5;
}
 
void more_foo()
{
    x = 10;  // OK
    y = 25.0;  // OK
    z = 1;  // фигушки!
}
в другом файле:
C
1
2
3
4
5
6
7
extern int x;   // OK!
extern double y;  // фигушки!
 
void another_foo()
{
    x = 33; // OK
}
2
toxxin
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 118
26.09.2009, 22:00  [ТС] #6
Нипонятно((((( Надо ботать наверное матчасть....
Ну вообще я имел ввиду что файл у меня один.
0
kravam
быдлокодер
1700 / 887 / 45
Регистрация: 04.06.2008
Сообщений: 5,491
26.09.2009, 23:53 #7
Всё понятно. Хорошо, начнём с твоего случая. Пусть у тебя один файл. А теперь наполни его содержимым кода номер 1 CheshireCat,
Ну, всё. Компилируй и наблюдай. Спрашивай.
1
Evg
Эксперт CАвтор FAQ
18030 / 6262 / 427
Регистрация: 30.03.2009
Сообщений: 17,207
Записей в блоге: 27
27.09.2009, 00:10 #8
Попробую по простому, т.е. на примерах

========================================================

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void func1 (void)
{
}
 
static int x;
 
void func2 (void)
{
  x = 1;
}
 
void func3 (void)
{
  x = 2;
}
Для данного примера наличие модификатора static по сути дела означает лишь то, что переменная НЕ будет видна из других модулей (исходных файлов). "Видна" означает доступ по имени "x". В данном случае ты можешь обращаться к переменной из функций func2 и func3. Ничто бы не мешало обращаться к ней из func1, но обращаться к переменной нельзя до тех пор, пока она не оьъявлена. Т.е. в данном случае и без "sttaic" обращаться было бы нельзя

========================================================

Второе использование static'а - это создание глобальной переменной, обращаться к которой можно только из конкретной функции (или даже лексического блока)

C
1
2
3
4
5
6
7
8
9
10
11
void func1 (void)
{
  static int x;
  x = 1;
}
 
void func2 (void)
{
  static int x;
  x = 2;
}
Здесь реально получаются две разные переменные (т.е. выделяются. две ячейка памяти). Но обращаться к ним можно только в соотсветствующей процедуре. По большому счёту этот код эквивалентен

C
1
2
3
4
5
6
7
8
9
10
11
12
static int x1;
static int x2;
 
void func1 (void)
{
  x1 = 1;
}
 
void func2 (void)
{
  x2 = 2;
}
static переменную обычно прячут внутри процедуры, чтобы случайно не начать работать с ней в другой. Т.е. чисто технически это можно рассматривать как некий элемент удобства
2
toxxin
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 118
27.09.2009, 00:50  [ТС] #9
Всем спасибо. Ваши примеры плюс чтение мануалов все разъяснило.
0
27.09.2009, 00:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.09.2009, 00:50
Привет! Вот еще темы с ответами:

Объявление переменных в С++ - C++
Начал изучение С++ и возник такой вопрос как повторно производить действия с переменными после их объявления?

Объявление переменных - C++
Добрый вечер.Подскажите,пожалуйста,не могу разобраться.Непонятно,почему в строках 14-15 значение переменных увеличивается на единицу,там же...

В чем отличие ссылочных переменных от указателей? - C++
Всем привет. Вопрос в теме, чем отличаются int a=5; int &p=a; от int a=5; int *p=&a; Кроме того, что ссылочная переменная...

Объявление и инициализация переменных - C++
помогите исправить, пожалуйста.... Решение: #include <iostream.h> #include <math.h> double GetY (unsigned short int Number); ...


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

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

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