Встретил в коде участок следующего вида:
int a = a;
компиляция проходит успешно. Вопрос - Как это работает?
Встретил в коде участок следующего вида:
int a = a;
компиляция проходит успешно. Вопрос - Как это работает?
N1256 6.2.1/7
Any other identifier has scope that begins just after the completion of its declarator .
То есть область видимости имени переменной начинается сразу после declarator. В Вашем случае в инициализаторе имя уже видно и может быть использовано. Это значит, что Вы можете инициализировать переменную саму собой, соответственно при этом она получит неопределенное значение.
К слову, в C++ действует такое же правило, и это значит, что возможно скопировать еще неинициализированный объект:
Some s1 = s1;
std::string s1 = s2;
Если (и, как правило), конструктор копирования никак не обрабатывает "самокопирование", то объект после такой "инициализации" будет пребывать в неопределенном состоянии.
unsigned char x = 12; { unsigned char x = x; } Here the second x is initialized with its own (indeterminate) value.
– Croessmah stands with Russia
Mar 13 '18 at 19:23
a имеет автоматический класс памяти, то конструкция вида some_type a = a; корректна только в том случае, если some_type — это беззнаковый узкий символьный тип или std::byte, в противном случае поведение программы не определено. dcl.init, 11.6/12.
– wololo
Mar 14 '18 at 11:18
После того, как переменная была объявлена, ей сразу же было присвоено какое то значение (даже если ее не инициализировать), равное тому мусору, которое было в выделенной памяти до нее. Действительно, хотелось бы увидеть код, где это используется, но например так можно получить какое то случайное целое число.