Существует два случая: в области видимости файла (т. Е. Для глобального объявления) и в функции.
В функции объявление int i;
выполняет две функции: объявляет переменную с именем i
, тип которой равен int
, и резервирует некоторую память в памяти для помещения значения типа int
. Что он не делает, так это дает переменной значение. Хранилище, используемое i
, будет по-прежнему содержать мусор, который был там раньше. Вам нужно инициализировать переменную, то есть присвоить ей значение, прежде чем вы сможете прочитать значение из нее. Хорошие компиляторы предупредят вас, если вы не инициализируете переменную.
В области действия файла , int i
также объявляет переменную с именем i
. Остальное зависит от других вещей: это известно как предварительное определение . Вы можете иметь несколько таких объявлений в вашем файле. Не более одного из них может иметь инициализатор, что делает его полнофункциональным определением. Если ни одно из объявлений i
в области видимости файла не имеет инициализатора, объявление также является определением, и существует неявная инициализация 0
. Таким образом:
int i;
/* ... more code ...*/
int i;
является действительным, и i
будет инициализирован в 0 (при условии, что это единственные объявления i
в области видимости файла). Принимая во внимание:
int i;
int i = 3;
также допустимо, и i
будет инициализировано 3 при запуске программы.
На практике в области видимости файла часто существует разница между неявной инициализацией и явной инициализацией равной 0. Многие компиляторы сохраняют явный 0 в двоичном файле, но позволяют операционной системе автоматически инициализировать неявные нули при загрузке программы. , Не беспокойтесь об этом, если у вас большой глобальный массив (что не должно часто случаться) или вы работаете на крошечных встроенных системах.