Разница между локальной областью и областью функций - PullRequest
5 голосов
/ 28 октября 2011

Однажды я предположил, что эти два значения имеют одно и то же значение, но после прочтения подробностей об этом мне все еще не ясно о разнице.Разве локальная область иногда не относится к области функции?и что это значит, что только метки имеют область действия функции?

Ответы [ 5 ]

15 голосов
/ 28 октября 2011
void doSomething()
{                                    <-------
     {                   <----               | 
                              |              |
         int a;           Local Scope    Function Scope
                              |              |
     }                   <----               | 
}                                    <------- 

Область действия функции находится между внешними { }.

Локальная область находится между внутренними { }

Обратите внимание, что любая область, созданная с помощью {``}, может называться локальной областью, тогда как {``} в начале тела функции создает область действия.
Поэтому иногда локальная область действия может совпадать с областью действия функции.

что означает, что только метки имеют область действия функции?

Labels - это не что иное, как идентификаторы, за которыми следует двоеточие. Помеченные операторы используются в качестве целей для goto операторов. Метки могут использоваться в любом месте функции, в которой они появляются, но на них нельзя ссылаться вне тела функции. Следовательно, у них, как говорят, есть Функциональная Область.

Пример кода:

int doSomething(int x, int y, int z)
{
     label:  x += (y + z);   /*  label has function scope*/
     if (x > 1) 
         goto label;
}

int doSomethingMore(int a, int b, int c)
{
     if (a > 1) 
         goto label; /*  illegal jump to undefined label */
}
4 голосов
/ 28 октября 2011

Локальная область видимости - это область между {и закрытием}.Область действия функции - это область между открытием {функции и ее закрытием}, которая может содержать больше «локальных» областей.Метка видна во всей функции, в которой она определена, например,

int f( int a ) 
{
    int b = 8;
    if ( a > 14 )
    {
       int c = 50;
       label:
       return c - a - b;
    }
    if ( a > 7 ) goto label;
    return -99;
}

int c не видна за пределами своего ограничивающего блока.метка видна за пределами своего ограничивающего блока, но только для области действия.

2 голосов
/ 28 октября 2011

Разве локальная область иногда не ссылается на область функции?

Да. В большинстве языков, производных от C, переменные действительны в той области, в которой они объявлены. Если вы объявляете переменную внутри функции, но не внутри какого-либо другого блока кода, то эта переменная обычно называется «локальной» или «автоматической» переменной. Вы можете обратиться к нему в любом месте функции. С другой стороны, если вы объявите свою переменную в другом блоке кода, скажем, в теле условного оператора, тогда переменная будет действительной только внутри этого блока. Несколько других ответов здесь дают хорошие примеры.

и что это значит, что только метки имеют область действия функции?

Контекст был бы полезен, но это означает, что вы не можете перейти от одной функции к метке в другой функции.

void foo(int a) {
    if (a == 0) goto here;  // okay -- 'here' is inside this function
    printf("a is not zero\n");
    goto there;             // not okay -- 'there' is not inside this function
here:
    return;
}

void bar(int b) {
    if (b == 0) goto there; // okay -- 'there' is in this function
    printf("b is not zero\n");
there:
    return;
}

Не всколыхнуть гнездо шершня, но объем ярлыков, вероятно, не будет появляться слишком часто. Метки в основном полезны с оператором goto, который необходим очень редко, если вообще когда-либо, и даже если вы решили использовать goto, вы, вероятно, даже не подумаете о попытке перейти к другой функции.

1 голос
/ 28 октября 2011
bool m[3][3];
void f1()
{
  int i;
  // redefining a variable with the same name in the same scope isn't possible
  //int i; //error C2086: 'int i' : redefinition
}

void f2()
{
  int i; // ok, same name as the i in f1(), different function scope.

  {
    int i; // ok, same name as the i above, but different local scope.
  }

  // the scope if the following i is local to the for loop, so it's ok, too.
  for (int i = 0; i < 3; i++)
  {
    for (int j = 0; j < 3; j++)
    {
      if (m[i][j])
        goto loopExit;
    }
  }
loopExit:
  std::cout << "done checking m";
// redefining a label with the same name in the same function isn't possible
// loopExit:; // error C2045: 'loopExit' : label redefined
}

void f3()
{
loopExit:; // ok, same label name as in f2(), but different function scope
}
1 голос
/ 28 октября 2011

Область действия функции немного больше, чем область действия функции body : аргументы функции находятся во внешней области, а локальные переменные - только во внутренней.Это наиболее очевидно проявляется в блоке try-try:

void f(int a) try {
  // function body
} catch(...) {
  // catch block
}

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

Конечно, вы можете и всегда вводить более глубокие вложенные области видимости, например, в for телах циклов или условных телах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...