Точка объявления в C ++

c++

1696 просмотра

3 ответа

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

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

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

422634

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

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

Автор: masoud Источник Размещён: 12.11.2019 09:26

Ответы (3)


45 плюса

Решение

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

Точка декларации для имени находится сразу после его полного декларатора и перед его инициализатором ... [Стандарт C ++ § 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из 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.

Автор: masoud Размещён: 01.04.2013 03:26

9 плюса

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

#include <iostream>
int x = 101;
int main()
{
  int x = ::x;
  std::cout << x << std::endl;
  std::cin.get();
}
Автор: greego Размещён: 01.04.2013 03:39

0 плюса

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

Автор: chuang wang Размещён: 01.04.2013 04:29
Вопросы из категории :
32x32