Точка декларации в С++ - программирование
Подтвердить что ты не робот

Точка декларации в С++

Почему не вывод 101, в то время как я назначил предыдущий x для нового x?

int x = 101;
{
    int x = x;
    std::cout << x << std::endl;
}

Выход (мусор):

422634

Я думал, что второй x будет инициализирован 101, но он не инициализирован.

Примечание. Решение в этом случае int x = ::x, но вопрос в том, почему это происходит.

4b9b3361

Ответ 1

Точка декларации

Точка объявления для имени сразу после завершения declarator и перед его инициализатором... [С++ Standard § 3.3.2/1]

Компилятор завершает объявление, когда он достаточно знает об объявлении.

Выше код равен нижнему:

int x = 101;
{
  int x;
  x = x; <------------------// Self assignment, assigns an indeterminate value.
  std::cout << x << std::endl;
}

Потому что объявление внутренней x завершено до = (присвоение)

int x = x; <--// Now, we have the new `x` which hides the older one, 
     ^        // so it assigns itself to itself
     |
     +---// Point of declaration,
         // here compiler knows everything to declare `x`.
         // then declares it.

 

С другой стороны, когда мы объявляем сложные объекты, точка декларации находится дальше. Таким образом, поведение отличается.

Например, ниже код в порядке

const int i = 2;
{
  int i[i];
         ^
         |
         +----// Point of declaration
              // compiler has to reach to "]"
              // therefore before declaring `i` as an array
              // there is just one `i`, the `i` of `const int i=2`
}

В вышеприведенном коде компилятор должен знать фактический размер массива для завершения объявления, поэтому точка объявления ]. Поэтому i внутри [i] является внешним i, потому что объявление i of int i[... еще не завершено. Таким образом, он объявляет массив с элементами 2 (int i[2];).

 

Кроме того, в этом примере показана точка объявления для перечислителя

const int x = 12;
{
  enum { x = x };
               ^
               |
               +---// Point of declaration
                   // compiler has to reach to "}" then
                   // there is just one `x`, the `x` of `const int x=12`

}

Перечислитель x инициализируется значением константы x, а именно 12.

Ответ 2

Есть еще один способ сделать это.

#include <iostream>
int x = 101;
int main()
{
  int x = ::x;
  std::cout << x << std::endl;
  std::cin.get();
}

Ответ 3

переменная область Перед x будет перезаписано. int x = x; Это один из двух процессов. Один: int x; (определите переменную x и выделите память и укажите начальное значение: x = 0); этот момент, фронт х будет скрыт. Два: x = x; (не находите значение x);