[英]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/
返回的值指向一個內部數組,該數組的有效性或值可通過隨后調用
asctime
或ctime
來更改 。
http://en.cppreference.com/w/cpp/chrono/c/ctime
該字符串可以在
std::asctime
和std::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.