Подтвердить что ты не робот

Использование переменной с тем же именем в разных пространствах

Этот код компилируется, но у меня есть ошибка времени выполнения в 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;
}
4b9b3361

Ответ 1

x определяется слева от =.

поэтому в x[x], [x] обратитесь к глобальному,

тогда как в x = x;, x скрывает глобальный x и инициализирует из себя → UB.

Ответ 2

Когда вы объявляете новую переменную, ее имя становится видимым прямо здесь.

int x =
//     ^- there

поскольку именно в этот момент переменная полностью объявлена ​​и как таковая; его название означает что-то. В этот момент времени любая другая (ранее объявленная переменная) в окружающем пространстве будет скрыта.

Ответ 3

В C нет оператора разрешения области видимости, поэтому вы не сможете использовать

int x = x;

в вашей программе.

Ответ 4

используйте 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;
}