2015-10-16 25 views
6

thể bất cứ ai xin hãy giải thích hành vi của tài liệu tham khảo trong mã này và tại sao nó in 12 trong dòng đầu tiên thay vì 11.Tài liệu tham khảo trong C++ có chức năng

Dưới đây là đoạn code

http://ideone.com/l9qaBp

#include <cstdio> 
using namespace std; 

int &fun() 
{ 
    static int x = 10; 
    x++; 
    return x; 
} 

int main() 
{ 
    int *ptr=&fun(); 
    int *ptr1=&fun(); 
    printf("%p %p \t %d %d",(void*)ptr,(void*)ptr1,*ptr,*ptr1); 
    return 0; 
} 

đầu ra của mã là

134519132 134519132 12 12

Xin giải thích vì sao là nhận in theo yêu cầu đầu tiên không tôi hiểu khi cuộc gọi thứ hai được thực hiện nó nên in 12

Trả lời

2

Lỗi của bạn dường như đang suy nghĩ rằng printf() in *ptr ngay khi có sẵn. Nó không; printf() không được gọi cho đến khi cả hai ptrptr1 được tính. Vì cả hai ptrptr1 trỏ đến cùng một vị trí bộ nhớ, đó là một biến tĩnh và vị trí đó được cập nhật sau cả lần gọi đầu tiên đến số fun() thứ hai.

+0

Cảm ơn bạn đã chỉ ra lỗi của mình khi nghĩ rằng printf() in * ptr ngay khi có sẵn. –

+0

Bạn có thể vui lòng giải thích tại sao printf() được gọi sau khi cả hai giá trị được tính –

+0

@Raghib Ahsan Vì đó là loại ngôn ngữ C là. Trong C bạn mô tả những gì sẽ xảy ra để thứ tự trong những gì bạn gõ những thứ là thứ tự trong đó mã được thực hiện. Printf của bạn được viết sau khi các câu lệnh thực hiện các hàm do đó các giá trị được tính toán trước và chỉ sau đó chương trình của bạn đọc lại các kết quả và in nó. Đọc trang wiki trên C, và đặc biệt là theo liên kết về lập trình bắt buộc trong câu đầu tiên, nếu bạn muốn tìm hiểu thêm về điều này. [liên kết] (https://en.wikipedia.org/wiki/C_ (programming_language)) – Nathilion

3

Các int tài liệu tham khảo được trả về bởi niềm vui() là như nhau cho cả cuộc gọi (ref để tĩnh x), do đó địa chỉ của tham chiếu đó là giống nhau cho cả hai cuộc gọi. Do đó, sự suy xét kết quả của địa chỉ giống hệt đó là giá trị giống hệt nhau hiện tại.

4

ptrptr1 đang trỏ đến cùng một biến static int x. Cuộc gọi thứ hai đã thay đổi giá trị của static int x thành 12, sau đó bạn in ra giá trị bằng derefernce ptrptr1, kết quả tương tự sẽ được in ra.

0

static biến có mức độ lâu dài và được lưu trữ trong bộ nhớ phân bổ tĩnh. Điều đó có nghĩa là việc lưu trữ các biến cục bộ trong một hàm không được cấp phát và được phân phối trên ngăn xếp cuộc gọi.

Khi x được khởi tạo vào thời gian biên dịch, giá trị x được lưu trữ giữa các lời gọi hàm fun.

Như C++ báo cáo được thực hiện tuần tự, printf sẽ được thực hiện sau khi lời gọi hai chức năng cuộc gọi trong đường dây đưa

int *ptr=&fun(); 
int *ptr1=&fun(); 

và do đó giá trị của x sẽ 12 trước khi thực hiện printf báo cáo.

Hãy ghi nhớ rằng

int *ptr=&fun(); 
int *ptr1=&fun(); 

không tương đương với

int& (*ptr)() = &fun; 
int& (*ptr1)() = &fun;  

Trong đoạn thứ hai ptrptr1 cả giữ địa chỉ của chức năng fun.Trong trường hợp này bạn cần phải gọi hàm trực tiếp hoặc bằng cách sử dụng những gợi ý như

int a = ptr(); 
int b = ptr1(); 

sau khi giá trị gọi này của ab sẽ 12.

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