#include <stdio.h>
int main()
{
int i,j=3;
i=4+2*j/i-1;
printf("%d",i);
return 0;
}
Он будет печатать 9 каждый раз, хотя я не инициализирован, Так, он должен распечатать любую стоимость мусора. Объясните...
#include <stdio.h>
int main()
{
int i,j=3;
i=4+2*j/i-1;
printf("%d",i);
return 0;
}
Он будет печатать 9 каждый раз, хотя я не инициализирован, Так, он должен распечатать любую стоимость мусора. Объясните...
Значение неинициализированной локальной переменной в C является неопределенным, и чтение может вызвать поведение undefined.
Теперь повторное выполнение конкретной программы, скомпилированной с конкретным компилятором в конкретной среде (как вы это делаете), вероятно, приведет к тому же (по-прежнему undefined, конечно) поведению. Это может быть связано с тем, что ОС обычно предоставляет вашему процессу один и тот же диапазон логической памяти каждый раз, когда вы запускаете его, и, следовательно, мусор, который читает ваша программа, имеет много шансов быть одним и тем же каждый раз (но все равно мусор, тем не менее). Или это может быть из-за того, что компилятор даже не потрудился дать вам двоичное представление мусора, который вы читали бы, и вместо этого даст вам что-то еще (до тех пор, пока оно не нарушит стандарт).
В результате ваш код будет Undefined Behavior
. Undefined поведение относится к компьютерному коду, поведение которого непредсказуемо. Вывод кода зависит от компилятора, среды.
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.
Когда переменная используется перед ее инициализацией, она берет значение памяти из памяти.
A Значение мусора - это значение, которое сохраняется в памяти, зарезервированной для этой переменной (в данном случае i
).
При компиляции вашей программы каждый раз, когда она будет извлекать предыдущее сохраненное значение из этой ячейки памяти и приведет к поведению undefined.
Не обязательно, чтобы каждый раз он выдавал вывод 9
. Программа может вести себя по-разному при компиляции с разными компиляторами.