簡體   English   中英

在cout上打印時間時奇怪的C ++行為

[英]Weird C++ Behavior while printing our time on cout

運行以下代碼:

  1 #include <iostream>
  2 int main(int argc, char** argv)
  3 {
  4     time_t t1 = time(0);
  5     time_t t(0);
  6     std::cout<<"BUG LINE"<<std::endl<< ctime(&t) << ctime(&t1) ;
  7     std::cout<<"PRINTS FINE HERE"<<std::endl;
  8     std::cout<< ctime(&t);
  9     std::cout<< ctime(&t1);
 10     return 0;
 11 }

構建:g ++ test1.cpp

Output:
./a.out
BUG LINE
Thu Jan  1 01:00:00 1970
Thu Jan  1 01:00:00 1970
PRINTS FINE HERE
Thu Jan  1 01:00:00 1970
Wed Jul 10 16:31:48 2013

為什么在代碼的#6中流變得奇怪?

http://www.cplusplus.com/reference/ctime/ctime/

返回的值指向一個內部數組該數組的有效性或值可通過隨后調用asctimectime來更改

http://en.cppreference.com/w/cpp/chrono/c/ctime

該字符串可以在std::asctimestd::ctime之間共享,並且在任何這些函數的每次調用時都可能被覆蓋

在您的示例中,在第6行,首先對ctime(&t1)求值,然后覆蓋字符串的ctime(&t) (未指定先求值者,並且編譯器通常按相反順序求值( 通常 ,並非總是))。

TL; DR:閱讀文檔可能會有所幫助。

函數ctime返回一個static字符串緩沖區-因此每次返回的字符串都是完全相同的字符串),這意味着在同一行上多次調用它會產生未定義的行為(因為C和C ++標准不會以什么順序告訴撥打電話)。

解決方案是調用兩個不同的語句(之間使用;或使用reentrant-safe變體,在該變量中傳遞緩沖區以將結果存儲在其中),例如ctime_r

這里的問題是ctime()使用內部分配的char數組,每次調用ctime()都會對其進行修改。

這里的另一個問題是您的ctime()可以在該表達式中以任何順序求值。 因此,這里發生的是對第6行的兩個參數都進行了評估,但是很明顯第二個要素被評估了。 然后從左到右應用運算符,但已經評估了兩次對ctime調用,最左端的調用在此之后完成,現在兩個字符串都引用同一件事。

如果將它們放在不同的行上,則會獲得預期的行為。

http://www.cplusplus.com/reference/ctime/ctime/

一個C字符串,包含人類可讀格式的日期和時間信息。

返回的值指向一個內部數組,該數組的有效性或值可以通過隨后對asctime或ctime的任何調用來更改。

返回的值指向一個內部數組,該數組的有效性或值可以通過隨后對asctime或ctime的任何調用來更改。

這正是這里發生的事情。 該行中對ctime的兩個調用之一在另一個調用之前執行,但都在cout可以打印它們之前執行。 由於它們(可能)返回相同的臨時char緩沖區,因此在cout到達打印時,您將獲得相同的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM