输出流中引用的奇怪行为

Strange behaviour from references in an output stream

本文关键字:引用 输出流      更新时间:2023-10-16

我注意到将输出打印到流时出现奇怪的行为。 我的代码循环遍历一个大型数据集,除其他外,从每个项目中读取时间戳。 存储第一项的时间戳,以便可以计算经过的时间。

CurTime = ev[i].MidasTimeStamp;
RunTimeElapsed = difftime(CurTime,StartTime);
cout << "StartTime: " << ctime(&StartTime) << "CurTime: " << ctime(&CurTime) << "Elapsed: " << RunTimeElapsed << " s" << endl;  
打印

到屏幕的输出显示两次打印的相同时间,例如:

StartTime: Mon Sep 23 14:44:57 2013
CurTime: Mon Sep 23 14:44:57 2013
Elapsed: 360 s

但如果将打印行一分为二:

cout << "StartTime: " << ctime(&StartTime); 
cout << "CurTime: " << ctime(&CurTime) << "Elapsed: " << RunTimeElapsed << " s" << endl; 

我得到预期的输出:

StartTime: Mon Sep 23 14:44:57 2013
CurTime: Mon Sep 23 14:50:57 2013
Elapsed: 360 s

两个输出之间的唯一变化是cout线。这很容易解决,但我想了解发生了什么。

来自 ctime 的文档:

返回值指向其有效性或值的内部数组 可能会通过任何后续对 ASCtime 或 CTIME 的调用来更改。

未指定表达式中子表达式的计算顺序。特别是,编译器先调用ctime两次,然后根据需要调用operator<<是合法的。这似乎是你的情况下发生的事情。