2012-03-15 2 views
2

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

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

ответ

7

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

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

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

int blockCount = 0; 

* См. Также: What happens to a declared, uninitialized variable in C? Does it have a value?

+0

Я всегда считал, что переменные уже были инициализированы 0 по соглашению, но, по-видимому, нет. Спасибо, что объяснили! –

+3

Только переменные 'static' и, в ARC, указатели объектов, а не примитивы типа' int'. Рад, что смог помочь! –

+2

@timjver Я хотел добавить в качестве примечания, поскольку вы говорите, что вы новичок в программировании, одна из причин, почему так оно и есть. Инициализация до 0 требует небольшого количества процессорного времени. Не инициализируя, это небольшое увеличение производительности. В конце концов, вы очень хорошо можете начать с другого значения, чем 0. Инициализация до 0 - это шаг, который вы можете пропустить. –

Смежные вопросы