在进行分析之前先看一个例子:
例子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--=0
printf the value: i= 0, i++= -1, i--= 0
the case 1:
the first value of x is:5
the value of foo1: 5
the second value of x is:7
the value of foo2: 7
*/
//例子2输出:
/*
cout the value: i=0 i++=-1 i--=0
printf the value: i= 0, i++= -1, i--= 0
the case 2:
the second value of x is: 5
the first value of x is: 7
the value of foo1: 7 the 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 2
cout<<"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:5
the value of x is:7
the value of foo: 7 5
*/