Каждая переменная имеет определенную область видимости - участок программы, в рамках которого её можно использовать. Переменные бывают глобальными и локальными (автоматическими)
Локальные переменные.
Локальные переменные определяются внутри блока кода (например, внутри функции) и существуют только в рамках этого блока. Эти переменные характеризуются автоматическим временем жизни: при входе в блок для этих переменных выделяется память (которую еще называют автоматическая память), а после завершения работы этого блока, выделенная память освобождается, а объекты удаляются. То же самое касается переменных, которые определены во вложенных блоках кода, например, условных конструкциях if..else, switch..case, циклах for,while, do..while. Например:
void printn()
{
{
int n = 20; // локальная переменная
printf("%d \n", n);
}
printf("%d \n", n); // Ошибка - здесь переменная n не видна
}
Здесь переменная n по прежнему является локальной и автоматической. Но она определена не просто в функции, а в блоке кода внутри функции. И вне этого блока кода даже внутри функции ее нельзя использовать, потому что после завершения блока кода она удаляется.
Глобальные переменные.
Глобальные переменные определены в файле программы вне любой из функций и могут использоваться любой функцией из этого файла.
#include <stdio.h>
int n = 5;
void printn()
{
n++;
printf("n=%d \n", n);
}
int main( void )
{
printn(); // n=6
n++;
printf("n=%d \n", n); // n=7
return >0;
}
Здесь переменная n является глобальной и доступна из любой функции. При этом любая функция может изменить ее значение.
Использование глобальных переменных следует по возможности избегать по следующим причинам:
- Нарушают инкапсуляцию.
- Вызывают путаницу в большом проекте.
- Ухудшают масштабируемость проекта.
- Ухудшают читаемость кода.
- Приводят к трудно уловимым ошибкам.
- Увеличивают число прямых и косвенных связей в системе, делая её поведение трудно предсказуемым, а её саму – сложной для понимания.
Сокрытие переменных.
Если имена локальной и глобальной переменной совпадают, то в локальной области видимости используется локальная переменная.
#include <stdio.h>
in n = 5;
int main( void )
{
int n = 10;
printf("n=%d \n", n); // n=10
{
int n = 20;
printf("n=%d \n", n); // n=20
}
return 0;
}
Здесь определено три переменных с именем n. Автоматическая переменная n, определенная на уровне функции main (int n = 10;
) скрывает глобальную переменную n. А переменная n, определенная на уровне блока, скрывает переменную, определенную на уровне функции main.
Статические переменные.
Cтатические переменные определяются на уровне функций с помощью ключевого слово static. Они инициализируются только один раз и при последующих вызовах функции используется старое значение статической переменной. Например:
#include <stdio.h>
void display()
{
int i = 0;
static int j = 0;
i++;
j++;
printf("i=%d \n", i);
printf("j=%d \n", j);
}
int main( void )
{
display();
display();
display();
return 0;
}
Функция display вызывается три раза, и при каждом вызове программа повторно будет выделять память для переменной i, а после завершения работы display, память для переменной i будет освобождаться. Соответственно ее значение при каждом вызове будет неизменно. В противоположность этому, переменная j является статической, поэтому при завершении работы функции display она не уничтожается и при следующем вызове display используется старое значение переменной.
Константы.
В отличии от переменных, которые могут многократно изменяться во время выполнения программы, значение константы остаётся постоянными в течение работы всей программы. Объявить константы можно двумя способами.
- использовать директиву препроцессора #define.
- использовать ключевое слово const.
Директива используется следующим образом:
#define VAR_CONST_1 15
После ключевого слова #define следует имя константы, а затем её значение. При компиляции программы вместо имени константы VAR_CONST_1 будет подставляться значение 15. Такой вид объявления констант называют макросом, макроподстановкой или дефайновой заменой.
Второй способ объявления констант похож на объявление переменных, только перед типом ещё добавляется ключевое слово const:
const int n = 0xFFFF;
Как выбрать имя переменной.
Несколько советов по выбору имени переменной:
- Имя должно отражать суть того, для чего переменная используется
- Лучше составлять имя из нескольких английских слов
- Следует избегать однобуквенных имен переменных
- Переменные и идентификаторы следует писать в camelCase
- Константы лучше писать в SCREAMING_CASE
Комментарии ()