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

Почему значение по умолчанию для локальных переменных в C одинаково?

#include <stdio.h>  
int main()
{
    int i,j=3;
    i=4+2*j/i-1;
    printf("%d",i);
    return 0;
}

Он будет печатать 9 каждый раз, хотя я не инициализирован, Так, он должен распечатать любую стоимость мусора. Объясните...

4b9b3361

Ответ 1

Значение неинициализированной локальной переменной в C является неопределенным, и чтение может вызвать поведение undefined.

Теперь повторное выполнение конкретной программы, скомпилированной с конкретным компилятором в конкретной среде (как вы это делаете), вероятно, приведет к тому же (по-прежнему undefined, конечно) поведению. Это может быть связано с тем, что ОС обычно предоставляет вашему процессу один и тот же диапазон логической памяти каждый раз, когда вы запускаете его, и, следовательно, мусор, который читает ваша программа, имеет много шансов быть одним и тем же каждый раз (но все равно мусор, тем не менее). Или это может быть из-за того, что компилятор даже не потрудился дать вам двоичное представление мусора, который вы читали бы, и вместо этого даст вам что-то еще (до тех пор, пока оно не нарушит стандарт).

Ответ 2

В результате ваш код будет Undefined Behavior. Undefined поведение относится к компьютерному коду, поведение которого непредсказуемо. Вывод кода зависит от компилятора, среды.

Ответ 3

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf - это Международный стандарт для языков программирования C

Page No : 126

Heading : Semantics

Item No : 10

Цитата из этого

Если объект с автоматической продолжительностью хранения не инициализируется явно, его значение неопределенно.

Это должно ответить на ваш вопрос.

РЕДАКТИРОВАТЬ:, предложенный @Jens Gustedt в комментариях

6.3.2.1, p2, говорит Если lvalue обозначает объект с автоматическим временем хранения, который мог быть объявлен с помощью регистра класс хранения (никогда не был принят его адрес), и этот объект неинициализирован (не объявлен с инициализатором и не назначен для это было выполнено до использования), поведение undefined.

Ответ 4

Когда переменная используется перед ее инициализацией, она берет значение памяти из памяти.
A Значение мусора - это значение, которое сохраняется в памяти, зарезервированной для этой переменной (в данном случае i).

При компиляции вашей программы каждый раз, когда она будет извлекать предыдущее сохраненное значение из этой ячейки памяти и приведет к поведению undefined.
Не обязательно, чтобы каждый раз он выдавал вывод 9. Программа может вести себя по-разному при компиляции с разными компиляторами.