打印

浅谈C语言中cout和printf

[复制链接]
5597|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mxzwt|  楼主 | 2016-2-6 16:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前几天我学习的时候发现了cout这个函数,后来知道cout的功能其实就是printf的功能,只是printf比cout的功能更全面一些,但是上网查到了这样一个资料:
“今天无意中发现cout和printf是有点区别的,一个是输出语句,一个是输出函数
我编了个函数如下:
#include "iostream.h"
#include "stdio.h"
main()
{
int a;
for(a=0;a<24;a++)
{
  printf("++++++++++++\n");
  cout<<"============\n";
        printf("############\n");
}
    printf("@@@@@@@@@@@\n");
}
运行结果如下:
++++++++++++
++++++++++++
############
############
@@@@@@@@@@@
============
============
cout先是把输出结果存到缓存区,然后一次性输出,其实COUT输出的时候也是调用了printf函数;
pintf函数是每次输出结果;
这就是为了么在TIME程序中cout运行的时间要比printf函数快的原因;
当时有一点需要注意:cout<<"============\n";和cout<<"============"<<endl;也有不同,\n只是一个字符,而endl会将缓存区的数据全部输出并清零;在TIME程序中,如果采用cout<<"============"<<endl;结构反而会比Printf慢,因为多了一道调用缓存手续
下面打个很形象的比喻,大家都会明白
比如有100个**蛋,需要从A拿到B点,相当于程序中的输出
Printf把**蛋一次一个用手拿到B点
cout<<"  \n"先把**蛋全部放到篮子,然后一次性拿过去取出
cout<<" "<<endl先把**蛋放到篮子,然后一次一个拿过去再取出
尤其可见哪个快那个慢显而易见

读完这个资料之后我发现cout有一个优点,就是快,也就是说在程序末尾的时候,把所有需要进行cout输出的内容一次存入缓存区中,再调用printf函数,而printf是每次都调用了一次printf函数,所以看起来还是cout要快一些
但是后来我发现,上面的表述是有误的,有误的地方在于,不应该是“把**蛋一次性放入篮子里”,如果在结尾处再处理cout函数,也就是将要输出的内容存入缓冲区的话,有一个错误,就是从cout的功能来看,cout不仅能输出字符串“我是中国人”还可以输出已定义的变量a的数值,如果在程序结尾将要输出的字符存入缓冲区,如果在结尾的时候,变量a已经被赋上他值了,它输出的内容就是错误的,再说机器里的线路是有限的,也不能实现一次性把cout函数的内容都存进缓冲区,所以上面的话中和**蛋有关的表述是错误的应该是:
“先把**蛋一个一个地放到篮子里,然后再一次性地取出放到B点”
之后,问题就出来了,如果这样说,所谓的快就不显而易见了
所以**蛋表述整个都要改,应该是如下:
“cout<<" \n":先把**蛋一个一个地放到篮子里,然后再一次性地取出走了很长时间放到B点
printf是把**蛋一次一个用手拿到B点,每次都走了很长时间
这样表述,cout的快就显而易见了

相关帖子

沙发
ZhangStudy| | 2016-2-11 13:47 | 只看该作者
printf是C语言的输出函数,  cout是C++的输出对象。  C语言中没有输入输出语句

使用特权

评论回复
板凳
ZhangStudy| | 2016-2-11 13:50 | 只看该作者
后面讨论的cout和printf的表现区别,是它们的内部缓冲区的处理方式。
printf一般是按行缓冲,每次换行后才实际显示。
cout缓冲区较大,一般需要程序刷新缓冲,(std::cout << std::flush ; )  

使用特权

评论回复
地板
mxzwt|  楼主 | 2016-2-11 14:18 | 只看该作者
ZhangStudy 发表于 2016-2-11 13:47
printf是C语言的输出函数,  cout是C++的输出对象。  C语言中没有输入输出语句。 ...

为什么一定要强调这个概念的区别啊

使用特权

评论回复
5
mxzwt|  楼主 | 2016-2-11 14:18 | 只看该作者
ZhangStudy 发表于 2016-2-11 13:50
后面讨论的cout和printf的表现区别,是它们的内部缓冲区的处理方式。
printf一般是按行缓冲,每次换行后 ...

“程序刷新缓冲”是怎么运行的?

使用特权

评论回复
6
ZhangStudy| | 2016-2-12 14:55 | 只看该作者
刷新缓冲区  是指把缓冲区的内容送到屏幕上世纪输出;一般是缓冲区满会自动刷新。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

42

帖子

1

粉丝