web-dev-qa-db-ja.com

Cのtime(NULL)とは何ですか?

いくつかの基本的なC関数について学び、いくつかのマニュアルでtime(NULL)に遭遇しました。

これはどういう意味ですか?

52
dmubu

timeが現在の時間で満たすtime_tオブジェクトへのポインターを渡すことができます(戻り値は指定したものと同じです)。 NULLを渡すと、それは無視され、現在の時刻を表す新しいtime_tオブジェクトが返されるだけです。

42
jason

time(NULL)の呼び出しは、現在のカレンダー時間(1970年1月1日からの秒数)を返します。詳細については、 このリファレンス を参照してください。通常、time_t変数 へのポインターを渡すと、そのポインター変数は現在の時刻を指します。

28
jonsca

[ 重複、今削除された質問からコピーされた回答 。]

time()は非常に古い関数です。 C言語のタイプがlongでさえなかった時代にさかのぼります。むかしむかし、32ビット型のようなものを取得する唯一の方法は、2つのintsの配列を使用することでした-intsが16ビットだったときでした。

だからあなたは電話した

_int now[2];
time(now);
_

そして、32ビット時間を_now[0]_および_now[1]_に一度に16ビットで埋めました。 (これは、localtimectimeなどの他の時間関連関数が、ポインターを介して時間引数を受け入れる傾向がある理由を説明しています。)

後で、 dmrlongをコンパイラに追加し終えたので、言い始めることができます

_long now;
time(&now);
_

後になって、誰かがtime()がポインタを介して値を入力するのではなく、先に進んで値を返すと便利だと気づきました。しかし、後方互換性は素晴らしいことです。まだtime(&now)を実行しているすべてのコードの利益のために、time()関数はポインター引数をサポートし続ける必要がありました。戻り値を使用している場合は、これが後方互換性が必ずしもそれほど素晴らしいものではない理由です-ポインターとしてNULLを渡す必要があります:

_long now = time(NULL);
_

(もちろん、後で、プレーンlongの代わりに_time_t_を使用し始めたので、たとえば、 y2.038k問題 。)

[P.S. _int [2]_からlongへの変更、および戻り値を追加する変更が異なるタイミングで発生したかどうかは、実際にはわかりません。それらは同時に起こったかもしれません。ただし、時刻が配列として表された場合、ポインターを介して入力されるhadは、値として返されなかったため、もちろん、C関数は配列を返すことができません。]

12
Steve Summit

time関数は、現在の時刻を(time_t値)ある時点からの秒数(UNIXシステムでは、UTC 1970年1月1日午前0時以降)、1つの引数、time_t時刻が格納されるポインター。 NULLを引数として渡すと、timeは通常の戻り値として時刻を返しますが、他の場所には保存しません。

3
jwodder

Time:1970年1月1日からの経過時間を秒単位で返します

3
Mob
int main (void)
{   
    //print time in seconds from 1 Jan 1970 using c   
    float n = time(NULL);   
    printf("%.2f\n" , n);      
}      

これは1481986944.00と印刷されます(現時点では)。

2
k_clark.90

ctimeのドキュメント を参照する必要があります。 timeは、タイプtime_t *time_tオブジェクトへのポインター)の1つのパラメーターを取り、それに現在の時刻を割り当てる関数です。このポインターを渡す代わりに、NULLを渡し、代わりに返されたtime_t値を使用することもできます。

1

_time_t_オブジェクトへのポインターを渡すと、その時間は現在の時間でいっぱいになります(戻り値は指定したものと同じです)。 NULLを渡すと、それは無視され、現在の時刻を表す新しい_time_t_オブジェクトが返されるだけです。

Nb:time(&timer);timer = time(NULL);と同等です

0