C++中cout语句背后的堆栈知识(一)

2014-03-10 12:54:29 · 作者: · 浏览: 247

  C++中的cout是最常见的,假如cout后面有多个输出的话,他们的输出顺序是什么呢 决定他们输出顺序背后的原理是什么呢 先看下面的代码(1):

  1 #include

  2 using namespace std;

  3 int abs(int a);

  4 int main()

  5 { int a=-5;

  6 cout<

  7 }

  8 int abs(int a)

  9 { cout<<"int a"<

  10 return (a>=0 a:-a);

  11 }

  大家看一眼第6行的输出结果:很多人认为是-5

  int a

  5

  可实际的结果是这样吗 看下图

  图(1)

  是不是与我们期望的不一样

  最后的输出结果与cout背后的汇编中堆栈有很大联系,我们知道汇编中堆栈是“后入先出”的存储区,执行第6行语句,从右向左依次把要输出的值压入堆栈,最后从上到下依次输出,第6行的汇编伪代码如下(以下代码不是严格意义上的汇编代码,为容易理解而写成):

  push endl;//把换行符压入

  push abs(a);//压入函数返回值,函数返回值压入堆栈需要两步:首先先执行cout<<"int a"<

  push endl;

  push a;输出a的值

  到此所有的值都压入堆栈,并且此过程中执行其他语句(第9行)的输出结果在屏幕上已经显示出来,然后堆栈中的值依次出栈,在屏幕上先显示-5,再显示5;