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

Tôi đang cố gắng tạo một chương trình nhỏ tính số chữ số của một số đã cho.
Bất cứ khi nào tôi nhập các số như 200 kết quả mong đợi là 3. Thay vào đó, tôi nhận được 7963. Khi tôi đặt điểm ngắt tại dòng number_placement, tôi nhận giá trị mặc định là 7961, điều này thật lạ vì giá trị đó không được chỉ định ở bất kỳ đâu trong mã.Biến có giá trị mà không được gán C++

Bạn có thể giải thích tại sao tôi nhận được kết quả đó không?

+3

'int number_placement = 0;' Bạn không bao giờ khởi tạo nó, do đó, nó bắt đầu với một số giá trị rác. – BoBTFish

+0

Đó chỉ là bộ nhớ phân bổ rác không được phân loại mà không có giá trị được gán rõ ràng sẽ được khởi tạo vào thùng rác – EdChum

+1

Vì BobTFish đã chỉ ra rằng bạn không bao giờ khởi tạo biến nên bạn mong đợi điều gì ở đây? – EdChum

Trả lời

5

Chỉ cần thay đổi chức năng của bạn để

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

Đó là, thay đổi

int number_placement; 

để

int number_placement = 0; 

Nếu bạn cố gắng truy cập các biến chưa được khởi tạo, bạn sẽ nhận được giá trị rác vì nó là hành vi không xác định. Trình biên dịch sẽ chỉ cung cấp cho nó một số giá trị rác.

Liên kết này có thể có ích

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

3

Khi chương trình được biên dịch, biến bạn đã tạo (trong trường hợp này, number_placement), sẽ có một số không gian bộ nhớ phân bổ cho nó (một vị trí trong bộ nhớ, có địa chỉ). Nếu bạn cố gắng truy cập vào địa chỉ này (không gian này tôi đã nói), và bạn đã không gán bất cứ điều gì cho nó trước đó, bạn sẽ đọc những gì còn lại ở đó, nó là giá trị hiện tại. Chúng tôi gọi nó là rác vì bộ nhớ còn lại từ một số ứng dụng khác có thể đã sử dụng vị trí bộ nhớ này trước đây hoặc chỉ một số bộ nhớ không có bất kỳ giá trị nào được gán cho nó trước khi bộ nhớ được bật nguồn (hoặc bị hỏng vì bộ nhớ không làm mới vị trí này vì nó không được sử dụng).

Luôn khởi tạo biến của bạn.

Và theo đó, ý tôi là: Không đọc giá trị từ các biến mà bạn chưa gán giá trị trước đó.

Trong trường hợp của bạn, nếu bạn muốn bắt đầu truy cập của bạn từ số không, bạn nên khởi nó với zero:

int number_placement = 0; 

Trước khi truy cập vào nó (trong trường hợp của bạn, incrementing nó).

Các vấn đề liên quan