2014-12-17 18 views
5
#include <iostream> 
#include<stdlib.h> 
using namespace std; 

class test{ 
    public: 
    test(int a):i(a){ 
    } 
    int display(); 
    private: 
     int i; 
}; 

int test::display(){ 
    i; 
} 
int main() { 
    test obj(10); 
    cout<<obj.display(); 
    return 0; 
} 

Trong trường hợp trên, một số giá trị ngẫu nhiên được in. Nhưng khi tôi thay đổi tuyên bố chức năng như:Chắc chắn tôi quên trả về giá trị từ hàm nhưng khi tôi trả về tham chiếu trong khai báo hàm thì nó đã hoạt động. Tại sao?

int& display(); 

và định nghĩa như sau:

int& test::display(){ 
    i; 
} 

Nó hiển thị giá trị chính xác tức là 10 Tôi không biết tại sao?

+9

Hành vi không xác định. Mã của bạn có một lỗi, nó làm một cái gì đó bất ngờ. – juanchopanza

+1

Liên quan đến [Tại sao biên dịch đoạn mã C++ này (hàm không rỗng không trả về một giá trị)] (http://stackoverflow.com/q/20614282/1708801) –

Trả lời

7

Đây là hành vi không xác định, vì vậy mọi thứ đều có thể - bao gồm khả năng khi mã của bạn "hoạt động" như mong đợi. Trình biên dịch của bạn nên đã đưa ra một cảnh báo về điều này - điều quan trọng là xử lý các cảnh báo như là lỗi và sửa tất cả các vấn đề được báo cáo trước khi kiểm tra mã của bạn.

Trình biên dịch sử dụng ngăn xếp hoặc thanh ghi CPU để trả về giá trị từ các hàm. Khi thiếu return, không có dữ liệu nào được đặt trong không gian của giá trị trả lại. Tuy nhiên, dữ liệu mà bạn định quay trở lại có thể đã có trong sổ đăng ký hoặc trên ngăn xếp ở đúng nơi, vì vậy mã gọi điện thoại thể hiện hành vi bạn mong đợi. Nó vẫn chưa được xác định.

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