- 締切済み
初級者の質問――time_tについて
私はC言語の初級者です。 time関数というのは現在時刻をtime_t型で返すものですよね。 でも、私はこの意味がよくわかりません。 time_t型とは何でしょうか。 単なる整数なのでしょうか。 確か、time_t型というのは整数で、 1970年1月1日0時からの秒数(世界標準時)だと聞いた気がします。 しかし、(いくつか見てみましたが)大抵のC言語の本では、そういう説明はしていません。 「プログラミング言語C」(カーニハン、リッチー)という本では、 「timeは現在のカレンダー時間を返す。」 と説明しています。 「じゃあ、カレンダー時間って何?」と思いますが、「カレンダー時間」というものの説明は見当たりません。 time_tというのは整数と考えてよいのでしょうか。 time_tで変数宣言すると、プログラムを読む人が「あ、これは時間を表すんだな」とわかり易いから、time_tというものがあるのでしょうか。 それとも、 time_tが秒数を表すかどうかは処理系に依存するのでしょうか。 もし、1970年1月1日からの秒数を表すなら、time関数の戻り値を1年間の秒数で割って1970に足せば今何年かわかるプログラムになりそうですよね。(うるう年や時差は考慮する) それとも、それは処理系によっては正しく動かないプログラムになるのでしょうか。 (あくまでも考え方です。確か、time_tを渡せば年月日時分秒を返す関数があると思います。) ちなみに、おとといプログラムを作ってtime関数の戻り値を10進数で表示すると次のようになりました。(VC++) ==============プログラム============== #include <stdio.h> #include <time.h> int main(void) { time_t a; a=time(NULL); printf("%d\n",a); return(0); } ================結果=============== 1005300371
お礼
>時間の起点(というか、時間の管理方法)は time()の管轄であり、型であるtime_tは「time()が返す値を表現できること」が要求されているに過ぎません。 ということは、C言語の本で time関数はいついつからの秒数を返します、 などと書かない理由は自明ですね。 (No.6の回答より) >ANSI-Cにおいて「time_tは整数値」という規定があります。 time_tが整数値でなくてはいけないのか(time_tがdoubleでも規格に反しないのか)という点まで突っ込んで考えればきりはないですが、 私のような初級者がそこまで知る必要もないでしょう。 (質問から) >それとも、それは処理系によっては正しく動かないプログラムになるのでしょうか。 そういう可能性があるということですね。
補足
(締め切る前に―――ここの回答とは直接の関係はないですが) time関数は、失敗したとき(無効の場合)、 (time_t)-1、つまり、time_tでキャストした-1 を返します。 (質問は規格に関するものですが、規格のことは置いておいて。) 戻り値が負の数である可能性があることを考えると、time関数の戻り値の型は、 符号付きの型になっているのが自然のように思われます。 (キャストすれば何でもいいだろう、という考えは、確かにそれはそうですが。)