2015-04-08 16 views
5
#include <iostream> 
#include <string> 


using namespace std; 

int count_number_place(int number) 
    { 

    int number_placement; 

    while (number >= 1) 
    { 
     number_placement++; 
     cout << number_placement <<endl; 
     number/=10; 
    } 

    return number_placement; 
    } 



int main(int argc, const char * argv[]) 
    { 
    // insert code here... 

    int user_input_number; 

    cout << "Please enter your number here" << endl; 
    cin >> user_input_number; 
    cout << "User input number is "<< user_input_number <<endl; 
    cout << "The numbers of digits in the input number is :" << count_number_place(user_input_number) << endl; 

    return 0; 
    } 

Próbuję utworzyć mały program, który oblicza liczbę cyfr danej liczby.
Zawsze, gdy piszę w liczbach takich jak 200, oczekiwane wyniki to 3. Zamiast tego dostałem 7963. Kiedy umieściłem punkt przerwania na linii number_placement otrzymałem domyślną wartość 7961, co jest dziwne, ponieważ ta wartość nie została nigdzie przypisana w kodzie.Zmienna ma wartość bez przypisania C++

Proszę wyjaśnić, dlaczego dostałem taki wynik?

+3

'int number_placement = 0;' Nigdy go nie zainicjalizuj, więc zaczyna się od wartości śmieci. – BoBTFish

+0

To tylko nieintelizowana pamięć przydzielona do stosu śmieci bez jawnie przypisanych wartości zostanie zainicjowana do śmieci – EdChum

+1

Jak BobTFish zwrócił uwagę, że nigdy nie inicjalizujesz zmiennej, więc czego się tutaj spodziewasz? – EdChum

Odpowiedz

5

Wystarczy zmienić swoją funkcję

int count_number_place(int number) 
    { 

    int number_placement = 0;   // assign 0 

    while (number >= 1) 
     { 
     number_placement++; 
     cout << number_placement <<endl; 
     number/=10; 
     } 

    return number_placement; 
    } 

Oznacza to, że zmiany

int number_placement; 

do

int number_placement = 0; 

Jeśli próbujesz uzyskać dostęp do zmiennych niezainicjowane, dostaniesz wartości śmieci, ponieważ jest niezdefiniowanym zachowaniem. Kompilator poda tylko niektóre wartości śmieci.

Ten link może być przydatne

What happens to a declared, uninitialized variable in C? Does it have a value?

3

Gdy program jest skompilowany, utworzona zmienna (w tym przypadku number_placement), będzie miał trochę miejsca pamięci przydzielonej do niego (pozycję w pamięci, który ma adres). Jeśli spróbujesz uzyskać dostęp do tego adresu (to miejsce, o którym mówiłem), a wcześniej nic nie przypiszesz, przeczytasz, co zostało, jest to aktualna wartość. Nazywamy to śmieciami, ponieważ jest to pozostała pamięć z innej aplikacji, która mogła wcześniej używać tej pozycji pamięci, lub tylko z pamięci, która nie miała żadnej wartości przypisanej do niej wcześniej, ponieważ pamięć była włączona (lub uszkodzona z powodu pamięć nie odświeżyła tej pozycji, ponieważ była nieużywana).

Zawsze inicjalizuj zmienne.

Mam na myśli: Nie czytaj wartości ze zmiennych, którym wcześniej nie przypisano wartości.

W twoim przypadku, jeśli chcesz rozpocząć swój licznik od zera, należy zainicjować go zera:

int number_placement = 0; 

Przed dostępu do niego (w przypadku, zwiększając go).

Powiązane problemy