Смущающие проблемы глобальной области видимости C ++ - PullRequest
5 голосов
/ 03 декабря 2010

Я прохожу практический тест на C ++, и меня смущает набор вопросов, связанных с областью доступа и точкой объявления.Оба вопроса связаны друг с другом. Я знаю ответы. Что мне нужно, так это правильное объяснение:

Каково значение локальной переменной x в конце main

 int x = 5;
 int main(int argc, char** argv)
 {
    int x = x;
    return 0;
 }

ans: Undefined

Каково значение y в конце main?

    const int x = 5;
    int main(int argc, char** argv)
    {
       int x[x];
       int y = sizeof(x) / sizeof(int);
       return 0;
    }

ответ: 5

Ответы [ 2 ]

8 голосов
/ 03 декабря 2010

Из стандарта: 3.3.1 [basic.scope.pdecl]

Точка объявления для имени находится сразу после его полного декларатора (пункт 8) и перед инициализатором (если имеется), за исключением случаев, указанных ниже.

В стандарте даже есть два примера, чтобы прояснить это:

int x = 12;
{ int x = x; }

Здесь второй x инициализируется своим собственным (неопределенным) значением.

[Примечание: нелокальное имя остается видимым до момента объявления локального имени, которое его скрывает. [Пример:

const int i = 2;
{ int i[i]; }

объявляет локальный массив из двух целых чисел. ]]

Эти два примера охватывают два случая в вашем вопросе.

8 голосов
/ 03 декабря 2010

Управляется тем, когда появляется внутреннее x (начало его сферы действия). Стандарт гласит (3.3.1 в текущем стандарте, 3.3.2 в следующем) частично (мой курсив):

Точкой декларации для имени является немедленно после его полного декларатора и до его инициализатора.

С int x = x; он создается в точке =, поэтому, когда вы присваиваете ему x, это внутренний x, который используется. Поскольку для этого ничего не было установлено ранее, оно не определено.

С int x[x]; внутренний x появляется в ;, поэтому он использует внешний x в качестве размера массива.

...