2016-04-29 12 views
5

Tôi đã mong đợi mã sau đây sẽ in các dấu thời gian khác nhau t1 và t2, tuy nhiên kết quả cho thấy t1 và t2 giống nhau. Tôi đã phạm sai lầm ở đâu?cách sử dụng đúng ctime() để in các dấu thời gian khác nhau

#include<iostream> 
#include<ctime> 

using namespace std; 

int main() 
{ 
    time_t t1 = time(NULL); 
    cout << "time now " << ctime(&t1) << endl; 
    time_t t2 = t1 + 10000.0; 
    cout << "time now " << ctime(&t1) << endl << " time later " << ctime(&t2) <<endl; 
} 

Kết quả:

time now Thu Apr 28 20:37:03 2016 

time now Thu Apr 28 20:37:03 2016 

time later Thu Apr 28 20:37:03 2016 
+0

PS: Dựa trên câu trả lời tuyệt vời dưới đây, vấn đề nên liên quan đến cả hai cách ctime() Tác phẩm chức năng và các nhà biên soạn nhằm đánh giá lập luận cout. Đối với trường hợp sau, vui lòng tham khảo http://stackoverflow.com/questions/12960241/explain-the-order-of-evalution-in-printf để biết ví dụ – daydayup

Trả lời

4

Câu trả lời cho câu hỏi của bạn có thể được tìm thấy trong the manual page for the ctime() function:

điểm giá trị Sự trở lại thành một chuỗi tĩnh được phân bổ mà có thể được ghi đè bởi các cuộc gọi tiếp theo vào bất kỳ ngày nào và thời gian chức năng.

ctime() trả về con trỏ tới bộ đệm bên trong nó sử dụng. Mỗi lần nó được gọi, nó sẽ trả về một con trỏ đến cùng một bộ đệm:

cout << "time now " << ctime(&t1) << endl << " time later " << ctime(&t2) <<endl; 

Đối với dòng mã này, trình biên dịch tạo ra mã của bạn mà các cuộc gọi ctime() hai lần, sau đó thực hiện hành <<. Nhưng trong lần gọi thứ hai tới ctime(), nó ghi đè bộ đệm lần thứ hai, vì vậy khi toán tử << định dạng kết quả đầu ra, bởi vì kết quả của cuộc gọi đầu tiên đến ctime() là cùng một con trỏ và bộ đệm trỏ đến đã bị ghi đè bằng cuộc gọi thứ hai tới ctime(), bạn sẽ nhận được cùng một thời gian được in hai lần.

Cảm ơn bạn đã đăng một số Minimal, Complete, and Verifiable example.

3

ctime thực sự trở về là gì? Từ cppreference:

Con trỏ đến chuỗi ký tự kết thúc bằng văn bản rỗng tĩnh giữ biểu diễn văn bản ngày và giờ. Chuỗi có thể được chia sẻ giữa std::asctimestd::ctime và có thể bị ghi đè trên mỗi lệnh gọi của bất kỳ chức năng nào trong số đó.

Nó có khả năng làm việc ra rằng trên trình biên dịch của bạn, sau đó ctime() được gọi đầu tiên, sau đó mới hơn ctime(), sau đó cả hai operator<<() s nhận được đánh giá - mà phát ra cùng char*. Do lệnh không xác định, mã của bạn có hành vi không xác định. Trên một số trình biên dịch, nó có thể làm việc như bạn hy vọng nó sẽ! Trên của bạn, nó sẽ không xảy ra.

Nếu bạn tách ra hai cuộc gọi:

cout << "time now " << ctime(&t1) << endl; 
cout << " time later " << ctime(&t2) <<endl; 

bạn chắc chắn và luôn muốn nhìn thấy giá trị khác nhau.

2

Trích từ N1570 7.27.3 Thời gian chức năng chuyển đổi:

Trừ chức năng strftime, các chức năng này từng trả về một con trỏ đến một trong hai loại đối tượng tĩnh: một cấu trúc thời gian bị phá vỡ xuống hoặc một mảng char.Thực hiện bất kỳ hàm nào trả về một con trỏ đến một trong các kiểu đối tượng này có thể ghi đè thông tin trong bất kỳ đối tượng nào cùng loại được trỏ đến bởi giá trị được trả về từ bất kỳ cuộc gọi nào trước đó tới . để tránh các cuộc đua dữ liệu với lẫn nhau.

Điều này cho thấy các nội dung được trỏ bởi những gì được trả về từ ctime() có thể được ghi đè bởi một cuộc gọi khác của ctime(), vì vậy bạn sẽ phải sao chép kết quả sử dụng kết quả trong một biểu thức không có điểm chuỗi trong đó.

Hãy thử điều này:

#include<iostream> 
#include<ctime> 
#include<string> 

using namespace std; 

int main() 
{ 
    time_t t1 = time(NULL); 
    cout << "time now " << ctime(&t1) << endl; 
    time_t t2 = t1 + 10000.0; 
    string t1s = ctime(&t1); 
    string t2s = ctime(&t2); 
    cout << "time now " << t1s << endl << " time later " << t2s <<endl; 
} 
Các vấn đề liên quan