Подтвердить что ты не робот

Что означает "локальные переменные во внешнем объеме функции не могут использовать то же имя, что и любой параметр"?

Я читал пятое издание С++ primer. В третьем абзаце списка функциональных параметров главы 6.1. Он пишет " Кроме того, локальные переменные в самой внешней области функции могут не использовать то же имя, что и любой параметр". Что это значит?

Я не носитель английского языка. Я не понимаю фактических значений "внешнего охвата" функции.

4b9b3361

Ответ 1

Внешней областью действия функции является блок, который определяет тело функции. Вы можете поместить в него другие (внутренние) блоки и объявить переменные в тех, которые являются локальными для этого блока. Переменные во внутренних блоках могут иметь то же имя, что и во внешнем блоке, или параметры функции; они скрывают имена во внешней области. Переменные во внешнем блоке не могут иметь то же имя, что и параметр функции.

Чтобы продемонстрировать:

void f(int a)           // function has a parameter
{                       // beginning of function scope
    int b;              // OK: local variable
    {                   // beginning of inner block
        int a;          // OK: hides parameter
        int b;          // OK: hides outer variable
    }                   // end of inner block
    int a;              // Error: can't have same name as parameter
}

Ответ 2

Это означает, что вы не можете делать такие вещи:

void foo (int x)
{
    int x = 4; //in the outermost scope, invalid
}

Вы можете, однако, сделать это:

void foo (int x)
{
    { //this introduces a new scope
        int x = 4; //not in the outermost scope, valid
    }
}

Ответ 3

Это означает, что это неверно:

void f(int p)
{
   int p = 3;
}

этот

void f(int p)
{
  {
    int p = 3;
  }
}

разрешено.

Ответ 4

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

3.3.3 Область блока

2 Потенциальная область имени функционального параметра (включая один появляющийся в лямбда-деклараторе) или локально предопределенной функции переменная в определении функции (8.4) начинается с ее точки декларация. Если функция имеет функцию-try-block потенциал область действия параметра или локально заданной переменной функции в конце последнего связанного обработчика, в противном случае он заканчивается на конец самого внешнего блока определения функции. Параметр имя не должно быть обновлено в самом внешнем блоке функции или в самом внешнем блоке любого обработчика, связанного с Функция-примерочный блок.

3 Имя, объявленное в объявлении исключения, является локальным для обработчика и не должны быть повторно описаны в самом удаленном блоке обработчик.

4 Имена, объявленные в for-init-statement, for-range-declaration, и в условии if, while, for и switch statements локальный оператор if, while, for или switch (включая контролируемое выражение) и не должны быть повторно описаны в следующем условие этого утверждения или в самом внешнем блоке (или, для if выражение, любой из внешних блоков) контролируемого заявления; см. 6.4.

Например, этот фрагмент кода недействителен

if( int x = SomeFunction() )
{
    int x; // invalid declaration
    //...
}

Ответ 5

Представьте, что у вас есть функция 'foo', которая принимает целочисленный параметр 'bar'.

int foo (int bar)
{
    int bar = 0; // < illegal, this is the 'outermost' scope
    if (bar == 10) {
        int bar = 5; // legal (though unadvisable) this 'shadows' the passed-in 'bar'
        return bar;
    }
    return bar;
}

Первое внутреннее объявление "bar" является незаконным, поскольку переданный параметр также объявляется в том же контексте (хотя синтаксис не обязательно делает это ясным.)

Так же, как было бы неправильно писать:

int bar;
char bar[10];

Так как эти две переменные имеют одну и ту же область видимости.

Второе объявление бара (в функции foo выше) является законным (хотя обычно это плохая идея), поскольку оно объявлено во внутренней области "if" и, следовательно, честной игры.

Надеюсь, что это поможет.