Рубрики

Правила области в C

Область действия идентификатора — это часть программы, где идентификатор может быть непосредственно доступен. В C все идентификаторы имеют лексическую (или статическую) область видимости . Правила области видимости C можно отнести к следующим двум категориям.

Есть в основном 4 правила области видимости:

ScopeMeaning
File ScopeScope 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 ScopeScope 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 ScopeIdentifiers declared in function prototype are visible within the prototype
Function scopeFunction 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. Область действия файла: Эти переменные обычно объявляются вне всех функций и блоков в верхней части программы и могут быть доступны из любой части программы. Они также называются глобальными переменными области видимости, поскольку к ним можно получить глобальный доступ.
    Пример 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; 

    }

    Примечание. Чтобы ограничить доступ только к текущему файлу, глобальные переменные могут быть помечены как статические.

  2. Область действия блока: блок — это набор операторов, заключенных в левую и правую скобки, то есть «{» и «}» соответственно. Блоки могут быть вложены в C (блок может содержать другие блоки внутри него). Переменная, объявленная внутри блока, доступна в блоке и во всех внутренних блоках этого блока, но не доступна вне блока. В основном они локальны для блоков, в которых определены переменные, и недоступны снаружи.

    int main()

    {

      {

          int x = 10;

      }

      {

          // Ошибка: x здесь не доступен

          printf("%d", x);  

      }

      return 0;

    }

    Выход:

    x = 10, y = 20
    x = 11, y = 41
    x = 11, y = 20
    
  3. Область действия прототипа функции: диапазон этих переменных входит в список параметров функции. Область действия этих переменных начинается сразу после объявления в прототипе функции и продолжается до конца списка объявлений. Эта область не включает определение функции, а только ее прототип.
    Пример:

    // 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
  4. Область действия функции. Область действия функции начинается с открытия функции и заканчивается ее закрытием. Область действия функции применима только к меткам. Объявленная метка используется в качестве цели для перехода к оператору, и операторы goto и label должны находиться в одной и той же функции.
    Пример:

Теперь могут возникнуть различные вопросы относительно области доступа к переменным:
Что если внутренний блок сам имеет одну переменную с тем же именем?
Если внутренний блок объявляет переменную с тем же именем, что и переменная, объявленная внешним блоком, тогда видимость переменной внешнего блока заканчивается в точке объявления внутреннего блока.

Как насчет функций и параметров, передаваемых в функции?
Сама функция является блоком. Параметры и другие локальные переменные функции следуют тем же правилам области видимости блока.

Можно ли получить доступ к переменным блока в другом последующем блоке?
Нет, переменная, объявленная в блоке, доступна только внутри блока и всех внутренних блоков этого блока.

Например: следующая программа выдает ошибку компилятора.

int main()

{

  {

      int x = 10;

  }

  {

      // Ошибка: x здесь не доступен

      printf("%d", x);  

  }

  return 0;

}

Ошибка:

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

Пример:

// 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;

}

Выход:

 
x = 1, y = 2, z = 3
x = 10, y = 20.000000, z = 3 
x = 10, y = 20.000000, z = 100 

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Правила области в C

0.00 (0%) 0 votes