Область действия идентификатора — это часть программы, где идентификатор может быть непосредственно доступен. В C все идентификаторы имеют лексическую (или статическую) область видимости . Правила области видимости C можно отнести к следующим двум категориям.
Есть в основном 4 правила области видимости:
Scope | Meaning |
---|---|
File Scope | Scope of a Identifier starts at the beginning of the file and ends at the end of the file. It refers to only those Identifiers that are declared outside of all functions. The Identifiers of File scope are visible all over the file Identifiers having file scope are global |
Block Scope | Scope of a Identifier begins at opening of the block / ‘{‘ and ends at the end of the block / ‘}’. Identifiers with block scope are local to their block |
Function Prototype Scope | Identifiers declared in function prototype are visible within the prototype |
Function scope | Function scope begins at the opening of the function and ends with the closing of it. Function scope is applicable to labels only. A label declared is used as a target to goto statement and both goto and label statement must be in same function |
Давайте обсудим правила каждой области с примерами.
- Область действия файла: Эти переменные обычно объявляются вне всех функций и блоков в верхней части программы и могут быть доступны из любой части программы. Они также называются глобальными переменными области видимости, поскольку к ним можно получить глобальный доступ.
Пример 1:#include<stdio.h>
int
main()
{
{
int
x = 10, y = 20;
{
// Внешний блок содержит объявление x и y, поэтому
// следующий оператор действителен и печатает 10 и 20
printf
(
"x = %d, y = %d\n"
, x, y);
{
// y объявляется снова, поэтому внешний блок y недоступен
// в этом блоке
int
y = 40;
// Изменяет переменную внешнего блока x на 11
x++;
// Изменяет переменную этого блока y на 41
y++;
printf
(
"x = %d, y = %d\n"
, x, y);
}
// Этот оператор обращается только к переменным внешнего блока
printf
(
"x = %d, y = %d\n"
, x, y);
}
}
return
0;
}
Выход:
Before change within main: 5 After change within main: 10
Пример 2:
// C программа для иллюстрации
// область действия прототипа функции
#include <stdio.h>
// область действия прототипа функции
// (не является частью определения функции)
int
Sub(
int
num1,
int
num2);
// область файла
int
num1;
// Функция вычитания
int
Sub(
int
num1,
int
num2)
{
return
(num1-num2);
}
// Метод драйвера
int
main(
void
)
{
printf
(
"%d\n"
, Sub(10,5));
return
0;
}
void
func1()
{
{
// метка в области видимости даже
// хотя объявлено позже
goto
label_exec;
label_exec:;
}
// метка игнорирует область видимости блока
goto
label_exec;
}
void
funct2()
{
// throwserror:
// поскольку метка находится в f (), а не в g ()
goto
label_exec;
}
Примечание. Чтобы ограничить доступ только к текущему файлу, глобальные переменные могут быть помечены как статические.
- Область действия блока: блок — это набор операторов, заключенных в левую и правую скобки, то есть «{» и «}» соответственно. Блоки могут быть вложены в C (блок может содержать другие блоки внутри него). Переменная, объявленная внутри блока, доступна в блоке и во всех внутренних блоках этого блока, но не доступна вне блока. В основном они локальны для блоков, в которых определены переменные, и недоступны снаружи.
int
main()
{
{
int
x = 10;
}
{
// Ошибка: x здесь не доступен
printf
(
"%d"
, x);
}
return
0;
}
Выход:
x = 10, y = 20 x = 11, y = 41 x = 11, y = 20
- Область действия прототипа функции: диапазон этих переменных входит в список параметров функции. Область действия этих переменных начинается сразу после объявления в прототипе функции и продолжается до конца списка объявлений. Эта область не включает определение функции, а только ее прототип.
Пример:// C программа для иллюстрации области видимости переменных
#include<stdio.h>
int
main()
{
// Инициализация локальных переменных
int
x = 1, y = 2, z = 3;
printf
(
"x = %d, y = %d, z = %d\n"
,
x, y, z);
{
// меняем переменные x & y
int
x = 10;
float
y = 20;
printf
(
"x = %d, y = %f, z = %d\n"
,
x, y, z);
{
// меняем z
int
z = 100;
printf
(
"x = %d, y = %f, z = %d\n"
,
x, y, z);
}
}
return
0;
}
Выход:
5
- Область действия функции. Область действия функции начинается с открытия функции и заканчивается ее закрытием. Область действия функции применима только к меткам. Объявленная метка используется в качестве цели для перехода к оператору, и операторы goto и label должны находиться в одной и той же функции.
Пример:
Теперь могут возникнуть различные вопросы относительно области доступа к переменным:
Что если внутренний блок сам имеет одну переменную с тем же именем?
Если внутренний блок объявляет переменную с тем же именем, что и переменная, объявленная внешним блоком, тогда видимость переменной внешнего блока заканчивается в точке объявления внутреннего блока.
Как насчет функций и параметров, передаваемых в функции?
Сама функция является блоком. Параметры и другие локальные переменные функции следуют тем же правилам области видимости блока.
Можно ли получить доступ к переменным блока в другом последующем блоке?
Нет, переменная, объявленная в блоке, доступна только внутри блока и всех внутренних блоков этого блока.
Например: следующая программа выдает ошибку компилятора.
|
Ошибка:
prog.c: In function 'main': prog.c:8:15: error: 'x' undeclared (first use in this function) printf("%d", x); // Error: x is not accessible here ^ prog.c:8:15: note: each undeclared identifier is reported only once for each function it appears in
Пример:
|
Выход:
x = 1, y = 2, z = 3 x = 10, y = 20.000000, z = 3 x = 10, y = 20.000000, z = 100
Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Рекомендуемые посты:
- Сортировка структуры (по нескольким правилам) в C ++
- C | Объявление и область действия переменной | Вопрос 3
- C | Объявление и область действия переменной | Вопрос 7
- C | Объявление и область действия переменной | Вопрос 8
- C | Объявление и область действия переменной | Вопрос 6
- C | Объявление и область действия переменной | Вопрос 5
- C | Объявление и область действия переменной | Вопрос 1
- C | Объявление и область действия переменной | вопрос 2
- C | Объявление и область действия переменной | Вопрос 4
- Оператор разрешения области действия против этого указателя в C ++?
- Предопределенные макросы в C с примерами
- Как создать графический интерфейс в программировании на C, используя GTK Toolkit
- Библиотека ctype.h (<cctype>) в C / C ++ с примерами
- Слабые байты в структурах: объяснение на примере
0.00 (0%) 0 votes