2010-07-24 3 views
2

у меня есть путаница в понятиях статической integer.When я инициализировать статический целое число в основной функции т.е.путаница статических переменных

static int i; 

Теперь статическое целое число присваивается значение 0.Now на следующем шаге :

i++; 

я становлюсь 1.

Теперь программа завершается. Я хочу знать, какая программа будет работать в следующий раз. Кроме того, что произойдет, если вся программа будет закрыта? Я понимаю, что первая строка - static int i; таким образом, следующее значение, когда следующая функция запускается, должна сохранять значение i, когда оно было ранее запущено. Если да, то в чем преимущество создания переменной static? Имеет ли переменная ограничение по времени или может ли оно храниться вечно? Какова была бы ценность, если бы я снова запустил функцию?

+2

'i' не станет' 1', если вы вызываете 'i + 1;'. – kennytm

+0

Хороший! Я редактировал мой вопрос:). –

ответ

5

В C "статический" означает, что переменная имеет локальную область видимости в пределах глобальной хранения.

Объем переменных в C является блоком. Другими словами, переменные могут использоваться внутри объявленного блока. И обычно они просто сохраняют свои значения до тех пор, пока блок не закончится, после этого потеряется. Пример:

{ 
    int a; 
    // Only a can be used here 
    { 
     int b; 
     // a and b can be used here 
     { 
     int c; 
     // a,b and c can be used here 
     } 
     //just a and b can be used here. c is not available anymore 
    } 
    // only a can be used here. Neither b nor c are available anymore 
} 

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

Другим исключением является статическая переменная. Он отображается только внутри блока, но сохраняет его значение после завершения блока.

Это означает, что если вы объявите статическую переменную внутри функции, она будет поддерживать ее значение между вызовами функций.

Например, приведенная ниже функция имеет локальную переменную. Локальные переменные имеют объем блока (это означает, что вы можете получить доступ только к переменной «вар» внутри блока {} она объявлена, в том случае, ниже внутри функции):

void countFunction(void) 
{ 
    int var = 0; 
    var = var + 1; 
    printf("Value is %d\n", var); 
} 

После того, как переменная не является статичным, каждый раз, когда вы вызываете функцию, он будет печатать «Значение равно 1», потому что переменная хранится в стеке, который распределяется по вызову функции и освобождается после возвращения функции.

Если изменить вар быть статичным,

void countFunction(void) 
{ 
    static int var = 0; 
    var = var + 1; 
    printf("Value is %d\n", var); 
} 

Первый раз при вызове функции переменная будет инициализирована как 0 и функция будет показывать «Значение 1». Тем не менее, во второй раз var будет уже выделен и в глобальной области. Он не будет инициализирован снова, и функция отобразит «Значение равно 2».

Это в рамках выполнения программы.

Хотя статическая переменная выделяется до тех пор, пока выполняется ваша программа, она не сохраняет свое значение после завершения вашей программы (программа освободит всю память). Единственный способ сохранить значение для следующего прогона - сохранить его на энергонезависимом носителе, таком как диск.

Надеюсь, это поможет.

1

Значение i будет равно 0 при запуске приложения в следующий раз. Инициализация до 0 является инициализацией по умолчанию (что очень редко встречается в остальной части C), которая происходит при запуске программы.

Как вы представляете, что это будет храниться где-нибудь между исполнением? Всякий раз, когда ваше приложение завершается, его память будет восстановлена ​​операционной системой. Поэтому блок памяти, который хранит i, также будет потерян.

3

Это будет 0 снова, потому что с прекращения программы все памяти/переменные теряются.

так, что является преимуществом, что делает его статический?

Полезно до тех пор, пока вы не завершаете свою программу :) Его можно, например, использовать для подсчета, сколько раз вызывается функция, если вы используете статическую переменную в этой функции и увеличиваете ее при каждом вызове , Это просто простой пример, но, конечно, может быть более практическое использование.

Больше чтения:

C Static Variables

Смежные вопросы