2016-04-29 1 views
5

Я ожидал, что следующий код должен печатать разные метки времени t1 и t2, однако результат показывает, что t1 и t2 совпадают. Где я совершил ошибку?Как правильно использовать ctime() для печати разных временных меток

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

Результат:

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: На основе замечательных ответов ниже, проблема должна быть связана и как CTime() функция работает и составители порядка оценивать аргументы COUT. Для последнего, пожалуйста, обратитесь к http://stackoverflow.com/questions/12960241/explain-the-order-of-evalution-in-printf для примера – daydayup

ответ

4

Ответ на ваш вопрос может быть найден в the manual page for the ctime() function:

возвращения значение указывает на статически размещенную строку, которая может быть перезаписаны при последующих вызовах к любой из дат и времени функций.

ctime() возвращает указатель на внутренний буфер, который он использует. Каждый раз, когда она называется, она возвращает указатель на тот же буфер:

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

Для этой строки кода, ваш компилятор сгенерированный код, который вызывает ctime() дважды, а затем выполняет оператор <<. Но во втором вызове ctime() он перезаписывал буфер во второй раз, поэтому, когда оператор << форматирует вывод, поскольку результат первого вызова ctime() является тем же самым указателем, и буфер, на который он указывает, был перезаписан по второму звонку до ctime(), вы получаете то же время, что и дважды.

Благодарим вас за сообщение Minimal, Complete, and Verifiable example.

3

Что такое ctime Фактически возвращается? От cppreference:

Указатель на статическую символьную строку с нулевым символом, содержащую текстовое представление даты и времени. Строка может быть разделена между std::asctime и std::ctime и может быть перезаписана при каждом вызове любой из этих функций.

Это, вероятно, работает, что на ваш компилятор, позже ctime() вызывается первым, то новая ctime(), то оба operator<<() s получить оценку - которые испускают тот же char*. В результате неуказанного порядка ваш код имеет неопределенное поведение. На некоторых компиляторах это могло бы работать так, как вы надеялись! На твоем, это не так.

Если выделить два вызова:

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

вы определенно и последовательно видеть различные значения.

2

Цитаты из N1570 7.27.3 Функции преобразования времени:

для функции STRFTIME Кроме этого, эти функции каждый возвращает указатель на один из двух типов статических объектов: временная структуру разделенных вниз или массив символов.Выполнение любой из функций, возвращающих указатель на один из этих типов объектов, может перезаписывать информацию в любом объекте того же типа, на который указывает значение, возвращаемое из любого предыдущего вызова любому из них, и функции не требуются чтобы избежать гонок данных с друг на друга.

Это говорит о том, что содержание заостренного тем, что возвращается из ctime() может быть перезаписано другим вызовом ctime(), так что вам придется скопировать результат использовать результат в одном выражении, без точки последовательности в этом.

Попробуйте это:

#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; 
} 
Смежные вопросы