在将输出打印到流时,我注意到了奇怪的行为。我的代码循环遍历大型数据集,并且除其他外,从每个项目中读取时间戳。存储来自第一项的时间戳,从而可以计算经过的时间。
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线。这很容易解决,但我想了解发生了什么。
答案 0 :(得分:3)
来自ctime
的文档:
返回的值指向其有效性或值的内部数组 任何后来对asctime或ctime的调用都可能会改变。
表达式中子表达式的评估顺序未指定。特别是,编译器首先调用ctime
两次,然后根据需要调用operator<<
是合法的。这似乎是你的情况。