C/C++中cout和printf的运行机制

来源:互联网 发布:golang go的用法 编辑:程序博客网 时间:2024/05/20 11:31

在进行分析之前先看一个例子:

例子1:

#include <iostream>#include <stdio.h>using namespace std;static int x=3;int foo1(){   x+=2;   cout<<"the first value of x is:"<<x<<endl;   return x;}int foo2(){   x+=2;   cout<<"the second value of x is:"<<x<<endl;   return x;} int main(){   int i = 0;   cout<<"cout the value: "<<"i="<<i<<' '<<"i++="<<i++<<' '<<"i--="<<i--<<endl;   printf("printf the value: i= %d, i++= %d, i--= %d\n",i,i++,i--);   cout<<"the case 1: "<<endl;   cout<<"the value of foo1: "<<foo1()<<endl;   cout<<"the value of foo2: "<<foo2()<<endl;      return 0;}
例子2:

#include <iostream>#include <stdio.h>using namespace std;static int x=3;int foo1(){   x+=2;   cout<<"the first value of x is:"<<x<<endl;   return x;}int foo2(){   x+=2;   cout<<"the second value of x is:"<<x<<endl;   return x;} int main(){   int i = 0;   cout<<"cout the value: "<<"i="<<i<<' '<<"i++="<<i++<<' '<<"i--="<<i--<<endl;   printf("printf the value: i= %d, i++= %d, i--= %d\n",i,i++,i--);      cout<<"the case 2:"<<endl;   cout<<"\t the value of foo1: "<<foo1()<<"\t"<<"the value of foo2: "<<foo2()<<endl;   return 0;}

       观察例子1和例子2,唯一的不同就是cout输出foo1和foo2的值;这两个例子体现了cout和printf输出的运行机制,首先先看下这两个例子的输出:

//例子1输出:/*cout the value: i=0 i++=-1 i--=0printf the value: i= 0, i++= -1, i--= 0the case 1:the first value of x is:5the value of foo1: 5the second value of x is:7the value of foo2: 7*///例子2输出:/*cout the value: i=0 i++=-1 i--=0printf the value: i= 0, i++= -1, i--= 0the case 2:the second value of x is: 5the first value of x is: 7the value of foo1: 7the value of foo2: 5*//*从两个例子的输出可以看出foo1和foo2输出不同,下面将对cout和printf的输出机制进行分析,进行解释printf和cout的输出问题。*/

在c/c++中,cout和printf的机制是先从右往左读入缓冲区,然后再从左往右输出;

#include <iostream>using namespace std;int main(){   int a = 7;   int b = 6;   int c =5;     cout<<"a= "<<a<<' '<<"b= "<<b<<' '<<"c= "<<c<<endl;   return 0;}//cout和printf是先从右往左读入缓冲区,然后再从左往右输出;/*buffer:| 5 | 6 | 7 | 即依次把c=5,b=6,a=7压入缓冲区output:| 7 | 6 | 5 | 即依次输出a=7,b=6,c=5;*/

有了对cout和printf输出机制的了解,我们就可以分析上面例子的输出的结果:

//注:x是static变量,初始值x=3; int i = 0;   cout<<"cout the value: "<<"i="<<i<<' '<<"i++="<<i++<<' '<<"i--="<<i--<<endl;/*上面输出cout the value: i=0 i++=-1 i--=0;因为从右到左依次压入缓冲区,最右边的i=0压入缓冲区,再进行i--,则i=-1;继续把i=-1压入缓冲区,再进行i++,此时i=0;最后把i=0压入缓冲区;则此时缓冲区的值为buffer:| 0 | -1 | 0 |;输出时从左到右依次是0,-1,0;*/   printf("printf the value: i= %d, i++= %d, i--= %d\n",i,i++,i--);/*上面输出printf the value: i=0 i++=-1 i--=0;因为从右到左依次压入缓冲区,最右边的i=0压入缓冲区,再进行i--,则i=-1;继续把i=-1压入缓冲区,再进行i++,此时i=0;最后把i=0压入缓冲区;则此时缓冲区的值为buffer:| 0 | -1 | 0 |;输出时从左到右依次输出i,i++,i--是0,-1,0;因此cout和printf的运行机制是一样的*/   cout<<"the case 1: "<<endl;   cout<<"the value of foo1: "<<foo1()<<endl;/*上面语句cout<<"the value of foo1: "<<foo1()<<endl;首先调用foo1()函数,在foo1()函数中,先进行x+=2,即x=5;然后执行cout<<"the first value of x is: "<<endl;即在屏幕打印the first value of x is:5;继而执行return x;返回值为5,所以cout<<"the value of foo1: "<<foo1()输出the value of foo1: 5;*/   cout<<"the value of foo2: "<<foo2()<<endl;/*上面语句cout<<"the value of foo2: "<<foo2()<<endl;首先调用foo2()函数,在foo2()函数中,先进行x+=2,即x=7;然后执行cout<<"the second value of x is: "<<endl;即在屏幕打印the second value of x is:7;继而执行return x;返回值为7,所以cout<<"the value of foo2: "<<foo2()输出the value of foo2: 7;*///下面分析case 2cout<<"the case 2:"<<endl;   cout<<"\t the value of foo1: "<<foo1()<<"\t"<<"the value of foo2: "<<foo2()<<endl;/*    上面语句首先调用foo2()函数,再调用foo1()函数;在foo2()函数中,先进行x+=2,即x=5;然后执行cout<<"the second value of x is: "<<endl;即在屏幕打印the second value of x is:5;继而执行return x;返回值为5,cout时把foo2()函数的返回值5压入缓冲区;    进而调用foo1()函数,在foo1()函数中,先进行x+=2,即x=7;然后执行cout<<"the first value of x is: "<<endl;即在屏幕打印the first value of x is:7;继而执行return x;返回值为7,cout时把foo1()函数的返回值7压入缓冲区;此时缓冲区的值buffer:| 5 | 7 |;则从左到右依次输出foo1,foo2的值为7,5*/

最后给出一个例子:

#include <iostream>using namespace std;int foo(){   static int x =3;   x+=2;   cout<<"the value of x is:"<<x<<endl;   return x;} int main(){   cout<<"the value of foo: "<<foo()<<"\t"<<foo()<<endl;   return 0;}/*output:the value of x is:5the value of x is:7the value of foo: 75*/


0 0
原创粉丝点击