Почему не вывод 101
, в то время как я назначил предыдущий x
для нового x
?
int x = 101;
{
int x = x;
std::cout << x << std::endl;
}
Выход (мусор):
422634
Я думал, что второй x
будет инициализирован 101
, но он не инициализирован.
Примечание. Решение в этом случае int x = ::x
, но вопрос в том, почему это происходит.
Ответ 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);