Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Статические переменные



Статические переменные, подобно автоматическим, локальны в той функции или блоке, где они описаны. Разница заключается в том, что статические переменные не исчезают, когда функция (блок)завершает работу, и их значения сохраняются для последующих вызовов функции. Описание статических переменных выглядит так:

static char c; static int a=1;

Рассмотрим пример, в котором переменная объявлена как статическая.


Пример

/*статические переменные*/

#include <iostream.h>

int x=10;

void plus1()

{

static int x=0;

x=x+1;

cout<<"\n x="<<x;

}

void minus1()

{

x=x-1;

cout<<"\n вычитаем единицу: x="<<x;

}

main()

{

plus1();

plus1();

plus1();

minus1();

}

Начальное значение равное нулю переменная x принимает только один раз. Затем в программе main, функция plus1() несколько раз запускается, при каждом запуске функции аргумент x не изменяется, а остается значение из предыдущей функции. Таким образом повторение функции plus1 обеспечивает увеличение переменной x на 1 при каждом запуске 1, 2, 3... При вызове функции minus используется начальное присваивание 10 и результат будет равен 9.

Результатом работы программы будет вывод:

x=1

x=2

x=3

вычитаем единицу: x=9


7.1.1. Регистровые переменные.

Регистровые переменные объявляются в программе с помощью ключевого слова register и должны хранится в сверх быстрой памяти ЭВМ - регистрах. Используются аналогично автоматическим переменным. Целесообразность их применения - для увеличения быстродействия программы.

#include <iostream.h>

void plus1()

{

static int x=0;

x=x+1;

cout<<"\n x="<<x;

}

void minus1()

{

register int x=10;

x=x-1;

cout<<"\n вычитаем единицу: x="<<x;

}

main()

{

plus1();

plus1();

plus1();

minus1();

}

Результат выполнения программы не изменится.

Описание вводит имя в области видимости; то есть, имя может использоваться только в определенной части программы. Для имени, описанного в функции (такое имя часто называют локальным), эта область видимости простирается от точки описания до конца блока, в котором появилось описание; для имени не в функции и не в классе (называемого часто глобальным именем) область видимости простирается от точки описания до конца файла, в котором появилось описание. Описание имени в блоке может скрывать (прятать) описание во внутреннем блоке или глобальное имя. Можно переопределять имя внутри блока для ссылки на другой объект. После выхода из блока имя вновь обретает свое прежнее значение.


Пример:

int x; // глобальное x

f() {

int x; // локальное x прячет глобальное x

x = 1; // присвоить локальному x

{

int x; // прячет первое локальное x

x = 2; // присвоить второму локальному x

}

x = 3; // присвоить первому локальному x

}

int* p = &x; // взять адрес глобального x


Скрытие имен неизбежно при написании больших программ. Однако читающий человек легко может не заметить, что имя скрыто, и некоторые ошибки, возникающие вследствие этого, очень трудно обнаружить, главным образом потому, что они редкие. Значит скрытие имен следует минимизировать. Использование для глобальных переменных имен вроде i или x нежелательно.
С помощью применения операции разрешения области видимости:: можно использовать скрытое глобальное имя.

Пример:

#include <iostream.h>

int x;

f()

{

int x = 1; // скрывает глобальное x

::x = 2; // присваивает глобальному x

cout<<"\n x1= "<<x;

}

main()

{

f();

cout<<"\n x2= "<<x;

}

На экран будет выведено:

x1=1

x2=2
Возможности использовать скрытое локальное имя нет.


Область видимости имени начинается в точке описания. Это означает, что имя можно использовать даже для задания его собственного значения.

Пример:

int x;

f()

{

int x = x;

}


Это не является недопустимым, хотя и бессмысленно, и компилятор предупредит, что x "used before set" ("использовано до того, как задано"), если вы попробуете так сделать. Можно, напротив, не применяя операцию::, использовать одно имя для ссылки на два различных объекта в блоке.

Пример:

#include <iostream.h>

int x;

f()

{

int x = 1; // скрывает глобальное x

::x = 2; // присваивает глобальному x

cout<<"\n x1= "<<x;

}

f1() {

int y = x; // глобальное x

int x = 22;

y =y+ x; // локальное x

cout<<"y="<<y;

}

main()

{

f();

f1();

cout<<"\n x2= "<<x;

}

На экран будет выведено:

x1= 1y=24

x2= 2


Переменная y инициализируется значением глобального x, 2, а затем к нему прибавляется значение локальной переменной x, 22.

Имена параметров функции считаются описанными в самом внешнем блоке функции, поэтому

f(int x)

{

int x; // ошибка

}

фрагмент программы содержит ошибку, так как x определено дважды в одной и той же области видимости.





Дата публикования: 2014-12-08; Прочитано: 334 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.008 с)...