Область действия переменных
В языке Си нет ключевого слова, указывающего область действия (видимости) объекта. Область действия определяется местоположением декларации объекта в файле исходного текста программы.
Напомним общую структуру исходного текста программы:
<директивы препроцессора>
<описание глобальных объектов>
<заголовок функции>
{
<описание локальных объектов>
<список инструкций>
}
Файл исходного текста может включать любое количество определений функций и/или глобальных данных.
Параметры функции являются локальными объектами и должны отличаться по идентификаторам от используемых в коде функции глобальных объектов. Локальные объекты, описанные в коде функции, имеют приоритет перед объектами, описанными вне функции, например:
#include<stdio.h>
int f1(int);
int f2(int);
int f3(int);
int n; // Глобальная n
void main (void)
{
int i=2; // Локальная i=2
n=3; // Глобальная n=3
i = f1(i); // Обе переменные i – локальные
printf(" 1: i=%d , n=%d\n",i,n); // i=7, n=3
n = f1(i); // n – глобальная, i – локальная
printf(" 2: i=%d , n=%d\n",i,n); // i=7, n=12
i = f2(n); // i и n – локальные
printf(" 3: i=%d , n=%d\n",i,n); // i=15, n=12
i = f3(i); // Обе переменные i – локальные
printf(" 4: i=%d , n=%d\n",i,n); // i=29, n=14
}
//–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
int f1(int i) { // Параметр функции i – локальная
int n = 5; // n – локальная
n+=i;
return n;
}
//–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
int f2(int n) { // Параметр функции n – локальная
n+=3;
return n;
}
//–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
int f3(int i) {
n+=2; // n – глобальная
return i+n;
}
Существуют следующие области действия: блок, файл, функция, прототип функции, область структурированных типов данных.
Блок. Идентификаторы, описанные внутри блока, являются локальными. Область действия идентификатора начинается в точке определения и заканчивается в конце блока, видимость – в пределах блока и внутренних блоков, время жизни – до выхода из блока. После выхода из блока память освобождается.
Файл. Идентификаторы, описанные вне любого блока, функции, класса или пространства имен, имеют глобальную видимость и постоянное время жизни и могут использоваться с момента их определения.
Функция. Единственными идентификаторами, имеющими такую область действия, являются метки операторов. В одной функции все метки должны различаться, но могут совпадать с метками других функций.
Прототип функции. Идентификаторы, указанные в списке параметров прототипа (декларации) функции, имеют областью действия только прототип функции.
Структурированный тип данных. Элементы структур и объединений являются видимыми лишь в их пределах. Они образуются при создании переменной указанного типа и разрушаются при ее уничтожении.
В языке С++ допускается в разных блоках программы использовать один и тот же идентификатор для разных объектов. Декларация такого идентификатора внутри блока скрывает доступ к ранее объявленному, например:
void main(void)
{
int a = 3;
printf(“\n Block 1: %d “, a); {
double a = 2.5;
printf( “\n Block 2: %lf “, a); {
char a = ‘A’;
printf( “\n Block 3: %c “, a);
}
printf( “\n New Block 2: %lf“, a+1.25);
}
printf( “\n New Block 1: %d“, ++a);
}
Результат программы:
Block 1: 3
Block 2: 2.5
Block 3: A
New Block 2: 3.75
New Block 1: 4
Дата добавления: 2017-10-04; просмотров: 1021;