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

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

 

  假如还有点迷糊的话,再看一个例子(代码2):

  1 #include

  2 using namespace std;

  3 int abs(int a);

  4 float abs(float b);

  5 int main()

  6 { int a=-5;

  7 float c=-2.4f;

  8 cout<<"a="<

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

  14 }

  15 float abs(float b)

  16 { cout<<"float abs"<

  17 return(b>=0 b:-b);

  18 }

  假如还按照原来的感觉,那么输出顺序应该是a=int abs

  5

  c=float abs

  2.4

  运行结果如下图:

  图(2)

  还是按照上面提到的汇编的方法分析下,压入堆栈的汇编伪代码如下:

  push endl;

  push abs(c);//需要强调的是这一步中 float abs立刻在屏幕中显示出来,无需等到所有的值压入堆栈完毕

  push c=;

  push endl;

  push abs(a);//这一步也立刻把int abs显示出来,显示在float abs下面

  push a=;

  等上面所有的步骤执行完后,然后堆栈中的值依次出栈,最后的输出结果如图(2),代码(2)用到了重载函数,也是很有趣的知识。顺便提一句,在重载函数中,任意两个函数的参数表中函数的个数,各参数的数据类型和顺序不能完全一样,如int func(int a,char b,float c)和double func(int d,char e,float f)。