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); 參数从右到左压入堆栈区:


  • 相关阅读:
    Java实现 LeetCode 343 整数拆分(动态规划入门经典)
    Java实现 LeetCode 342 4的幂
    Java实现 LeetCode 342 4的幂
    Java实现 LeetCode 342 4的幂
    Java实现 LeetCode 341 扁平化嵌套列表迭代器
    Java实现 LeetCode 341 扁平化嵌套列表迭代器
    Java实现 LeetCode 341 扁平化嵌套列表迭代器
    Java实现 LeetCode 338 比特位计数
    H264(NAL简介与I帧判断)
    分享一段H264视频和AAC音频的RTP封包代码
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5244098.html
Copyright © 2011-2022 走看看