Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Видимость статических переменных 
V
    Опции темы
yngwie19
Дата 27.5.2009, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Здравствуйте. Скажите пожалуйста есть такой код:
Код

void MyFunc();
int main()
{
      MyFunc();
     ............
      MyFunc();
     return 0;
}
void MyFunc()
{
      static int a = 10;
      static int b = 5;
}


Вопрос. При первом вызове функции MyFunc(), создаются и инициализируются статические переменные a и b, после выхода из этой функции они останутся существовать до завершения работы программы так?. Тогда что произойдет когда мы второй раз вызовем эту функцию? не будет ли конфликта? переменные ведь уже созданы в первом вызове этой функции.

Это сообщение отредактировал(а) yngwie19 - 27.5.2009, 16:39
PM MAIL   Вверх
mes
Дата 27.5.2009, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



при последующем входе в функцию переменные будут уже созданы и хранят значение оставшееся с момента последнего посещения.



--------------------
PM MAIL WWW   Вверх
yngwie19
Дата 27.5.2009, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



mes, т.е будет синтаксическая ошибка?
PM MAIL   Вверх
mes
Дата 27.5.2009, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(yngwie19 @  27.5.2009,  18:53 Найти цитируемый пост)
mes, т.е будет синтаксическая ошибка? 

почему ? особенно интересует почему "синтаксическая" ?!  smile 
все будет в порядке.

попробуйте такой пример, думаю он поможет разобраться. 
Код

int f(int i)
{
      static int a = 10;
      
      a+=i;
      return a;       
}

for (int i=0; i<100; ++i)
 std::cout << f(i)<<std::endl;


Это сообщение отредактировал(а) mes - 27.5.2009, 20:00


--------------------
PM MAIL WWW   Вверх
yngwie19
Дата 27.5.2009, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



просто мне не понятно при программировании на WinAPI в  функции окна например так:
Код

LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
static cxClient, cyClient;
    switch (msg)
    {
        case WM_CREATE:
        return 0;
        case WM_PAINT:
                PAINTSTRUCT ps;
                        TextOut(hdc,cxClient/2,cyClient/2,"Hello WinAPI",13);
                EndPaint(hwnd,&ps);
            return 0;
        case WM_SIZE:
                cxClient  = LOWORD(lParam);
                        cyClient = HIWORD(lParam);
            return 0;
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        default:
            return DefWindowProc(hwnd,msg,wParam,lParam);
    }

переменные cxClient и cyClient, получают значения из WM_SIZE, однако при обработке любого сообщения опять вызывается объявления cxClient и cyClient, т.к они находятся в самом начале функции WndProc. Как тут не происходит ошибки?

Добавлено через 6 минут и 3 секунды
mes, т.е инициализировав static int a = 10; один раз, следующие вызовы этой функций f(i) игнорируют эту инициализацию, переменная a уже к моменту второго вызова существует.
PM MAIL   Вверх
mes
Дата 27.5.2009, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(yngwie19 @  27.5.2009,  19:01 Найти цитируемый пост)
т.е инициализировав static int a = 10; один раз, следующие вызовы этой функций f(i) игнорируют эту инициализацию, переменная a уже к моменту второго вызова существует. 

да, они просто с ней работают.

Добавлено через 1 минуту и 23 секунды
P.S.
Цитата(yngwie19 @  27.5.2009,  19:01 Найти цитируемый пост)
static cxClient, cyClient;

а тут забыт тип smile


--------------------
PM MAIL WWW   Вверх
yngwie19
Дата 27.5.2009, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



mes, спасибо
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0457 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.