Niezainicjowane zmienne powodują, że program nie jest deterministyczny. Za każdym razem, gdy program działa, może zachowywać się inaczej. Niepowiązane zmiany środowiska operacyjnego, pory dnia, fazy księżyca i permutacji takich wpływają na to, jak i kiedy manifestują się te demony. Program może uruchomić milion razy, zanim pojawi się defekt, mogą to zrobić za każdym razem lub uruchomić kolejny milion. Wiele problemów sprowadza się do „usterki” i są ignorowane lub raporty o błędach od klientów są zamykane jako „nie do odtworzenia”. Jak często restartowałeś komputer, aby „naprawić” problem? Jak często mówiłeś do klienta: „Nigdy nie widziałem, żeby tak się stało, daj mi znać, jeśli zobaczysz to ponownie” - mając nadzieję (wiedząc), że nie będzie!
Ponieważ odtworzenie wady może być prawie niemożliwe w środowisku testowym, prawie niemożliwe jest jej znalezienie i naprawienie.
Ujawnienie błędu może zająć lata, zwykle w kodzie uważanym za niezawodny i stabilny. Zakłada się, że defekt ma nowszy kod - jego odnalezienie może potrwać znacznie dłużej. Zmiana w kompilatorze, przełącznik kompilatora, a nawet dodanie wiersza kodu może zmienić zachowanie.
Inicjowanie zmiennych ma ogromną przewagę wydajności, nie tylko dlatego, że program, który działa poprawnie, jest nieskończenie szybszy niż ten, który tego nie robi, ale programiści spędzają mniej czasu na szukaniu i naprawianiu defektów, których nie powinno być, a więcej na wykonywaniu „prawdziwej” pracy.
Inną znaczącą zaletą inicjowania zmiennych jest to, że autor kodu musi zdecydować, na czym je zainicjować. Nie zawsze jest to trywialne ćwiczenie, a gdy nie jest trywialne, może wskazywać na zły projekt.
Wycieki pamięci to inny problem, ale właściwa inicjalizacja może nie tylko pomóc w ich zapobieganiu, ale może również pomóc w ich wykryciu i znalezieniu źródła - jest w dużej mierze zależne od języka i to naprawdę osobne pytanie warte dalszych badań, niż jestem w stanie udzielić w tej odpowiedzi.
Edycja: W niektórych językach (np. C #) nie można używać niezainicjowanych zmiennych, ponieważ program nie będzie się kompilował ani nie zgłosi błędu po uruchomieniu, jeśli zostanie wykonany. Jednak wiele języków o tych cechach posiada interfejsy do potencjalnie niebezpiecznego kodu, dlatego należy zachować ostrożność, używając takich interfejsów no, aby wprowadzić niezainicjowane zmienne.