Ответ 1
x
определяется слева от =
.
поэтому в x[x]
, [x]
обратитесь к глобальному,
тогда как в x = x;
, x
скрывает глобальный x
и инициализирует из себя → UB.
Этот код компилируется, но у меня есть ошибка времени выполнения в Visual Studio:
Ошибка проверки времени выполнения # 3 - переменная "x" используется без инициализации...
int x = 15;
int main()
{
int x = x;
return 0;
}
Я не понимаю этого поведения... в окне ошибки, когда я нажимаю кнопку продолжения, программа возобновляет и x имеет поврежденное содержимое (например, -8556328
вместо 15
).
Почему этот код работает без проблем, и массив int хорошо объявлен?
const int x = 5;
int main()
{
int x[x] = {1,2,3,4};
return 0;
}
x
определяется слева от =
.
поэтому в x[x]
, [x]
обратитесь к глобальному,
тогда как в x = x;
, x
скрывает глобальный x
и инициализирует из себя → UB.
Когда вы объявляете новую переменную, ее имя становится видимым прямо здесь.
int x =
// ^- there
поскольку именно в этот момент переменная полностью объявлена и как таковая; его название означает что-то. В этот момент времени любая другая (ранее объявленная переменная) в окружающем пространстве будет скрыта.
В C нет оператора разрешения области видимости, поэтому вы не сможете использовать
int x = x;
в вашей программе.
используйте SRO (оператор разрешения масштаба::), чтобы сообщить компилятору, что x является реальным x в вашем уме. Поскольку пользовательские имена искажены (имена украшены), что-то вроде этого, чтобы избежать двусмысленности на уровне, это просто имена, используемые компилятором, который лучше всего подходит для него
int x = 15;// Real name = gui_x
int main()
{
int x = x;// lui_x
return 0;
}
Таким образом, время выполнения будет знать, какую версию вы используете, но чтобы избежать двусмысленности, которую он ожидает от вас, использовать конкретные имена. Иногда возникает проблема, когда вы не знаете, что используете уже используемые имена. Для этого С++ создал SRO.
Теперь в случае, когда массив x является адресом, а не целой, который хранит что-то, то почему компилятор не перепутал. Вам нужно написать
namespace abc //now all global variables are belongs to this ns abc
int x = 15;// Real name = gui_x
int main()
{
int x = abc::x;// lui_x
return 0;
}