zoukankan      html  css  js  c++  java
  • cout 堆栈,operator<< 运算符重载输出问题

    在C++中cout的输出流其中,有一些问题非常easy出错,就比方以下这道简单程序。看似简单。但却是一个值得深思的问题~~

    #include <iostream>

    using namespace std;


    int foo(int &x)
    {
          cout << "第" << x << "次调用" << " ";
          return ++x;
    }

    int main()
    {
          int i = 1;
          cout << foo(i) << ' ' << foo(i) << endl;

    }


    非常多人一開始会以为输出的结果会是:

    第1次调用 2 第2次调用 3


    可是结果却是:

    第1次调用 第2次调用 3 2


    为什么嘞??? 首先须要了解的是:


    进程空间:

    代码区----------------存放程序的运行代码
    全局数据区------------存放全局数据。常量,文字量。静态全局量和静态局部量
    堆区------------------存放动态内存。供程序随机申请使用
    栈区------------------函数数据区(局部数据区)
    (以上是执行中的内存布局)


    函数调用的整个过程就是栈空间操作的过程。

    函数调用时,C++作下面工作:
    (1)建立被调函数的栈空间。其大小由函数定义体中的数据量决定;
    (2)保护调用函数的执行状态和返回地址;
    (3)传递參数;
    (4)将控制权转交给被调函数;
    (5)函数执行完毕后。复制返回植到函数局部数据块底部;
    (6)恢复被调函数的执行状态;
    (7)返回调用函数。

    调用一个函数能够看作是一个栈中元素的压栈与退栈操作。


    有了以上的介绍,解释过程就能知道了:

    原始输出语句: cout << foo(i) << ' ' << foo(i) << endl;

    cout输出的运行顺序是从右向左运行的,so:

    1:运行<<endl,由于没有std::cout对象,无法运行,压栈

    2:运行<<foo(i),运行foo(1),输出:第1次调用,得到返回值2,还是由于没有std::cout对象。无法立即输出。压栈
    此时,代码变成cout << foo(i) << ' ' << 2 << endl;

    3:运行<< ' ' 。没有std::cout对象,无法立即输出。压栈
    此时。代码变成cout << foo(i) << ' ' << 2 << endl;

    4:运行<<foo(i),运行foo(2)。输出:第2次调用 得到返回值3,还是由于没有std::cout对象,无法立即输出,压栈
    此时。代码变成cout << 3 << ' ' << 2 << endl;


    对于以上过程还需注意两点:

    1. 【int& x】 也就是说 x实际上是i的别名

    2. cout << foo(i) << ' ' << foo(i) << endl;
    <==> operator << (cout, foo(i)的返回值, ' ', foo(i)的返回值, endl); 參数从右到左压入堆栈区:


  • 相关阅读:
    创建和发送事件
    (实战)为系统类添加NameValueTable属性,并且添加到相关对话框
    使用GetUniqueIndentifier为某类对象连续编码
    中秋小感
    数据库中取随机数的方法讨论
    CVS添加用户的过程和命令列表
    Mysql中获取刚插入的自增长id的三种方法归纳
    关于Action重复执行两遍的原因
    td内容空的时候,如何显示边框线
    2003下 tomcat 连mysql问题的解决
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5244098.html
Copyright © 2011-2022 走看看