2015-04-08 13 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; 
    } 

Sto provando a creare un piccolo programma che calcola il numero di cifre di un determinato numero.
Ogni volta che digito numeri come 200, i risultati previsti sono 3. Invece ho ottenuto 7963. Quando inserisco un breakpoint sulla linea number_placement, ho ottenuto un valore predefinito di 7961, il che è strano perché quel valore non è stato assegnato da nessuna parte nel codice.La variabile ha valore senza essere assegnata C++

Puoi spiegare perché ho ottenuto questo risultato?

+3

'int number_placement = 0;' Non lo si inizializza mai, quindi inizia con un valore non valido. – BoBTFish

+0

Questa è solo una memoria allocata non programmata per i rifiuti inutili, senza valori espliciti assegnati verrà inizializzata su immondizia – EdChum

+1

Come ha sottolineato BobTFish, non si inizializza mai la variabile, quindi cosa ci si aspetta qui? – EdChum

risposta

5

cambiare solo la funzione di

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; 
    } 

Cioè, modificare

int number_placement; 

a

int number_placement = 0; 

Se si tenta di accedere alle variabili non inizializzate, si otterrà i valori della spazzatura perchè è un comportamento indefinito. Il compilatore gli darà solo dei valori spazzatura.

Questo link potrebbe essere utile

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

3

Quando il programma viene compilato, la variabile si è creato (in questo caso, number_placement), avrà un po 'di spazio di memoria allocata a esso (una posizione in memoria, che ha un indirizzo). Se provate ad accedere a questo indirizzo (questo spazio di cui ho parlato), e prima non avete assegnato nulla, leggerete ciò che è rimasto lì, il suo valore attuale. Noi lo chiamiamo immondizia, perché è la memoria rimanente da qualche altra applicazione che avrebbe potuto utilizzare prima questa posizione di memoria, o solo una parte della memoria a cui non era stato assegnato alcun valore prima da quando la memoria era accesa (o danneggiata perché la memoria non ha aggiornato questa posizione perché non era in uso).

Inizializza sempre le variabili.

E con questo intendo: Non leggere valori da variabili che non hai assegnato un valore prima.

Nel tuo caso, se si desidera avviare il contatore da zero, si dovrebbe inizializzare con lo zero:

int number_placement = 0; 

prima di accedervi (nel tuo caso, l'incremento di esso).

Problemi correlati