могут ли переменные быть установлены случайным образом при их повторном объявлении?

В моем методе я объявляю некоторые переменные, в том числе int blockCount;. Я вызываю этот метод более одного раза. Используя отладчик Xcode, я обнаружил, что после второго вызова метода значение blockCount было установлено на 364265, тогда как оно было установлено на 2 всего несколькими миллисекундами ранее.

Это не проблема, так как я могу просто установить его в 0 или любое другое число, какое захочу, но является ли плохой привычкой программиста объявлять определенную переменную снова и снова? Я новичок в программировании и хочу убедиться, что делаю все правильно. :)


person Tim Vermeulen    schedule 15.03.2012    source источник


Ответы (1)


Если вы объявляете переменную, но не предоставляете для нее значение, она считается «неинициализированной». Неинициализированная переменная в C имеет «неопределенное» значение — обычно это мусор, содержащий все, что случилось по этому адресу в последний раз, когда что-то туда было записано. Однако, строго говоря, "undefined" означает, что вы ни при каких обстоятельствах не должны пытаться использовать это значение. (Если вы выполните поиск «носовые демоны», это будет объяснено в довольно красочных и полезных терминах. *)

Эта переменная, будучи локальной, воссоздается каждый раз при запуске метода и, таким образом, получает новое фактическое, хотя технически все еще неопределенное значение при каждом проходе.

Обычно рекомендуется не оставлять переменные неинициализированными, потому что «случайное» значение может вызвать ошибки, которые трудно найти, и время от времени вызывать вышеупомянутых носовых демонов. Вы не делаете ничего плохого, но если вы не устанавливаете фактическое значение в одной или двух строках объявления, я бы предложил инициализировать его значением 0 или каким-либо разумным значением по умолчанию:

int blockCount = 0;

* См. также: Что происходит с объявленной неинициализированной переменной в C? Имеет ли оно значение?

person jscs    schedule 15.03.2012
comment
Я всегда думал, что переменные уже инициализированы до 0 по соглашению, но, видимо, это не так. Спасибо за объяснение! - person Tim Vermeulen; 15.03.2012
comment
Только переменные static и, в соответствии с ARC, указатели объектов, а не примитивы, такие как int. Рад, что смог помочь! - person jscs; 15.03.2012
comment
@timjver Я хотел добавить в качестве примечания, поскольку вы говорите, что новичок в программировании, это одна из причин, почему это так. Инициализация в 0 требует небольшого количества процессорного времени. Отсутствие инициализации дает небольшой прирост производительности. В конце концов, вы вполне можете захотеть начать со значения, отличного от 0. Инициализация до 0 — это шаг, который вы можете пропустить. - person Jordan Mack; 15.03.2012
comment
@JMack Звучит справедливо, но почему бы не пропустить его, например, со статическими переменными? - person Tim Vermeulen; 16.03.2012
comment
@tim: по двум причинам, обе из которых вытекают из того факта, что статические переменные живут всю жизнь программы. Во-первых, они инициализируются только один раз, а это означает, что (уже небольшой) удар по производительности при установке значения 0 происходит только один раз, при запуске. Во-вторых, потому что вы часто используете статические переменные для хранения данных, которые дорого создавать, но которые не нужно изменять. Чтобы быть уверенным, что вы делаете это создание только один раз, переменная должна изначально иметь известное значение, которое вы можете проверить. Например, void f(void){ static void * expensive_dat; if( expensive_dat == NULL ){ // initialize } // use dat - person jscs; 16.03.2012
comment
@IuliusCæsar Так вот для чего это было, мне всегда было интересно. Спасибо за объяснение :) - person Tim Vermeulen; 16.03.2012