могат ли променливите да бъдат зададени произволно, когато ги декларирате отново?

В моя метод декларирам някои променливи, включително int blockCount;. Извиквам този метод повече от веднъж. С помощта на Xcode дебъгера открих, че след второто извикване на метода стойността на blockCount е зададена на 364265, докато е зададена на 2, само няколко милисекунди по-рано.

Това не е истински проблем, тъй като мога просто да го настроя на 0 или всяко друго число, което искам, но лош навик на програмиране ли е определена променлива да се декларира отново и отново? Аз съм съвсем нов в програмирането и искам да съм сигурен, че правя нещата по правилния начин. :)


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


Отговори (1)


Ако декларирате променлива, но не предоставите стойност за нея, тя се счита за "неинициализирана". Неинициализираната променлива в C има "недефинирана" стойност - обикновено е боклук, съдържащ всичко, което се е случило на този адрес последния път, когато нещо е било написано там. Строго погледнато обаче „недефиниран“ означава, че при никакви обстоятелства не трябва да се опитвате да използвате тази стойност. (Ако търсите „назални демони“, това ще бъде обяснено с доста колоритни, а също и полезни термини.*)

Тази променлива, тъй като е локална, се създава отново всеки път, когато методът се изпълнява, и по този начин получава нова действителна, макар и все още технически недефинирана стойност при всяко преминаване.

Обикновено се препоръчва да не оставяте променливите неинициализирани, защото "случайната" стойност може да причини грешки, които са трудни за намиране, и от време на време да призове гореспоменатите назални демони. Не правите нищо нередно, но ако не задавате действителната стойност в рамките на ред или два от декларацията, бих предложил да я инициализирате на 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