Я предполагаю, что вы находитесь в какой-то функции, так как вы вызываете функции и тому подобное.
Место для test
и x
выделено в стеке. Теоретически место для этих парней должно существовать до того, как будут заполнены их значения. Если мы посмотрим на сгенерированную сборку (x86 gcc), то это правда.
subl $40, %esp # Add 40 bytes of memory to the current stack
movl $0, -20(%ebp) # Clear test[0] to 0
movl $0, -16(%ebp) # Clear test[1] to 0
movl $45, -20(%ebp) # Place the value of 45 into test[0]
movl -20(%ebp), %eax # Copy that 45 into a register
movl %eax, -16(%ebp) # Move that register's value (45) into test[1]
movl $111, -12(%ebp) # Assign x to be 111, optimize out the unnecessary duplicate assignment
... #continues on to set up and call printf
Мы видим, что в стек добавлено 40 байт. Обратите внимание, что адреса test[0], test[1] и x являются непрерывными адресами, отделенными от %ebp
с интервалом в 4 байта (-20,-16,-12 соответственно). Их расположение в памяти существует, и к ним можно получить доступ без ошибок до того, как они будут определены. Здесь компилятор очищает их оба до 0, хотя мы видим, что это не нужно. Вы можете удалить эти две строки и все равно работать нормально.
Из этого мы можем сделать вывод, что ваши int test[2] и int x могут иметь любое количество причудливых циклических ссылок внутри себя и код будет скомпилирован - это просто ваша работа, чтобы убедиться, что ваши ссылки захватывают хорошие данные (то есть каким-то образом инициализированные данные), а не мусор, что вы сделали здесь. Это также работает и с другими случаями - скомпилируйте в сборку и проверьте сами, как это делается.
person
GraphicsMuncher
schedule
09.11.2012
int x = (x + 1)
также компилирует и устанавливаетx
в1
(во всяком случае, с GCC в Linux). - person apsillers   schedule 09.11.2012x
не инициализируется при оценке(x + 1)
. - person Jonathan Grynspan   schedule 09.11.2012int x = (x + 1);
) явно неопределенное поведение; вы увеличиваете неопределенное значение, которое не обязательно равно нулю. - person Jonathan Leffler   schedule 09.11.2012x = (x + 1)
и случайном выводе мусора (как я и ожидал). - person 0x5f3759df   schedule 09.11.2012int x = (x + 1);
в область файла (или пространства имен). Попробуйте поместить его в функцию. - person Praetorian   schedule 09.11.2012