4

Встретил в коде участок следующего вида:

int a = a;

компиляция проходит успешно. Вопрос - Как это работает?

αλεχολυτ
  • 28,987
  • 13
  • 60
  • 119
Idrt
  • 147
  • 2
    а можно кусок кода по больше, может это локальная переменная? – SkiF Mar 13 '18 at 14:48
  • В чем вы тут видите проблему? О чем именно вопрос? – AnT stands with Russia Mar 13 '18 at 15:11
  • Извините, но код показать не могу. Собственно исчерпывающий ответ уже получен! – Idrt Mar 13 '18 at 18:29
  • @Idrt я рад, что вам помогли в этот раз, но что ответить на такой вопрос это гадание на кофейной гуще. – SkiF Mar 14 '18 at 11:20

2 Answers2

5

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;

Если (и, как правило), конструктор копирования никак не обрабатывает "самокопирование", то объект после такой "инициализации" будет пребывать в неопределенном состоянии.

  • Премного Вам благодарен. – Idrt Mar 13 '18 at 18:31
  • 1
    А точнее попытка обращения к неинициализированной переменной является неопределенным поведением, и что там будет дальше, и будет ли вообще 0 неизвестно. – user7860670 Mar 13 '18 at 18:55
  • @VTT не понял причем здесь ноль. Ну и прямо из стандарта c++: 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
  • Хм, ноль действительно не при чем. Наверное новая клавиатура провоцирует на опечатки. – user7860670 Mar 13 '18 at 19:25
  • @Croessmah, В C++, если переменная a имеет автоматический класс памяти, то конструкция вида some_type a = a; корректна только в том случае, если some_type — это беззнаковый узкий символьный тип или std::byte, в противном случае поведение программы не определено. dcl.init, 11.6/12. – wololo Mar 14 '18 at 11:18
-2

После того, как переменная была объявлена, ей сразу же было присвоено какое то значение (даже если ее не инициализировать), равное тому мусору, которое было в выделенной памяти до нее. Действительно, хотелось бы увидеть код, где это используется, но например так можно получить какое то случайное целое число.