cout和printf不能混用

1、两者的缓存机制不同:printf无缓冲区,而std::cout有 (其实printf也是有缓冲区的,https://blog.csdn.net/ithzhang/article/details/6875176)

2、对于标准输出的加锁时机不同:printf在对标准输出作任何处理前先加锁;std::out在实际向标准输出打印时才加锁

3、二者存在微弱的时序差别,而在多线程环境下,很多问题就是由于微弱的时序差别造成的。所以两者混用很容易带来不可预知的错误,常见的错误有打印输出的结果不符合预期,而严重错误时甚至会导致内部缓冲区溢出,导致crash。

原文地址:https://www.cnblogs.com/shihuvini/p/9974921.html

时间: 2024-11-08 21:48:01

cout和printf不能混用的相关文章

cout和printf

#include <iostream> using namespace std; int main() { int i=0,j=0; cout<<i++<<"\t"<<i++<<"\t"; cout<<i++<<endl; printf("j++\tj++\t"); printf("j++\n"); return 0; } VC6.0 #inc

C++ 多线程中使用cout还是printf

在多线程的设计模式下,如果多个线程都使用cout打印信息,那么很容易出现内容交替的现象,例如下图: 代码如下: 如果把cout替换成printf,那么就不会出现这个问题,运行结果如下图: 对应代码如下: 上网搜索了下相关的内容,部分网友反馈结果是: cout不是线程安全的,要靠自己去线程同步,比较麻烦 .printf是线程安全的,也就是自己做了线程同步的处理. 这个结果有待继续考证,暂且记在这. 发现一篇对IOstream解释得比较好的文章,有一定的参考价值:http://www.cnblogs

C++-cin与scanf cout与printf效率问题

http://blog.csdn.net/l2580258/article/details/51319387 void cin_read_nosync() { freopen("data.txt","r",stdin); std::ios::sync_with_stdio(false); for (int i=0;i<MAXN;i++) std::cin >> numbers[i]; }

Cout vs printf---缓存与引用,流处理顺序(转ithzhang,知乎郝译钧)

一个知乎问题: VS2013,debug模式int i = 4;cout << i++ << i++ << endl;输出结果:54int i = 4;cout << ++i << ++i << endl;结果输出:66同样类似的问题出现在如下函数中void myFun(int i1, int i2) {cout << i1 << i2;}从右往左的结合性我理解..但是为什么一个是54,一个是66?满地打滚求解

sync_with_stdio和cin.tie(0); cout.tie(0);

sync_with_stdio 这个函数是一个“是否兼容stdio”的开关,C++为了兼容C,保证程序在使用了std::printf和std::cout的时候不发生混乱,将输出流绑到了一起. 应用 在ACM里,经常出现数据集超大造成 cin TLE的情况.这时候大部分人(包括原来我也是)认为这是cin的效率不及scanf的错,甚至还上升到C语言和C++语言的执行效率层面的无聊争论.其实像上文所说,这只是C++为了兼容而采取的保守措施.我们可以在IO之前将stdio解除绑定,这样做了之后要注意不要

cout、cerr、clog有何区别?

windows+vs情况下:在控制台上,cout能重定向到文件,cerr和clog不能.输出重定向到文件实际上就是一个管道的一头连输出流,另一头连文件输入流 cout具有自己的缓冲区,当缓冲区满或遇到endl会刷新终端(默认是屏幕):cerr没有缓冲区,直接刷新终端 cout的写缓存操作和系统刷新终端的操作是异步的,所以会存在当程序崩溃的情况下按代码执行顺序应该输出的内容可能只输出了一部分,而不是全部输出,因为这个时候程序已经崩溃了 cout.printf其实是写缓存.这就存在一个问题,当缓冲区

C语言-cout&lt;&lt;"123"&lt;&lt;"45"&lt;&lt;endl;

VC中头文件为:#include <iostream.h> 这个在c中没有.是C++引进的. cout<头文件#include中printf()类似. 只是不需要标明数据类型. endl就是end of line的意思.honly:为避免ElemType的类型变化的影响,用cout取代printf().注意结尾要加endl.比如ElemTypede的类型发生变化,相应的printf()中的输出格式控制符必须进行相应的改变,否则会发生错误,因此用cout输出.1.\n与endl区别在于:

C++ cout 如何保留小数输出

参考 : http://upliu.net/how-cout-out-2-precision.html 大家都知道用 C 语言中 printf () 函数可以非常方便控制保留 几位小数输出 不过在 C++ 当中也是可以控制小数保留,cout () 和 printf () 还是有一些区别 cout<<setiosflags(ios::fixed)<<setprecision(2);//需要头文件#include <iomanip> 然后再输出实数类型变量即可以保留2位小数

关于ios::sync_with_stdio(false);和 cin.tie(0)加速c++输入输出流

原文地址:http://www.hankcs.com/program/cpp/cin-tie-with-sync_with_stdio-acceleration-input-and-output.html http://www.clanfei.com/2012/03/235.html 在网上查看别人的ACM代码时,发现别人输入输出语句用的总是scanf与printf,有点不解,还以为他们用的都是C语言,而非C++,但今天做的一道题(Sort): 发现与网上的其他高手使用完全相同的方法,使用sca