У меня возник вопрос о том, как работает glibc ctime().Поймите последовательный вызов ctime()
Следит мой сниппет:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main (int argc,char** argv)
{
int ret=EXIT_SUCCESS;
time_t tm1;
time_t tm2;
tm1 = time(NULL);
tm2 = tm1 + 60; // 60 seconds later
puts("1st method-------");
printf("tm1 = %stm2 = %s",ctime(&tm1),ctime(&tm2));
puts("2nd method-------");
printf("tm1 = %s",ctime(&tm1));
printf("tm2 = %s",ctime(&tm2));
return(ret);
}
я получил:
1st method-------
tm1 = Sat Jan 14 01:13:28 2012
tm2 = Sat Jan 14 01:13:28 2012
2nd method-------
tm1 = Sat Jan 14 01:13:28 2012
tm2 = Sat Jan 14 01:14:28 2012
Как вы видите, в первом способе и тм имеют такое же значение, которое не является правильным. Во втором методе я получил правильные значения. Я знаю, что ctime() помещает эту строку в статический буфер, и для ее перезаписывания нам нужен последовательный вызов ctime().
В: Я не делаю последовательный вызов в 1-м методе?
Благодарим за внимание.
спасибо, но, как вы видите, он сохранил старый (tm1), а не новый (tm2) результат, он не перезаписывает буфер, если только ctime (& tm2) не обрабатывается до ctime (& tm1) – hadi
@ Хади: То, что вы, похоже, не понимаете, состоит в том, что аргументы приводятся в обратном порядке. когда оба выражения ctime являются прерванными для printf, одно с tm1 называется LAST, а не FIRST. Скотт понял это правильно. – boatcoder
@ Mark0978 Параметры функции не оцениваются в определенном порядке в 'C'. _Вы могли бы знать это к этому времени. _ Http://stackoverflow.com/questions/376278/parameter-evaluation-order-before-a-function-calling-in-c – VoidPointer