zoukankan      html  css  js  c++  java
  • cout操作符的递归

    参考:http://bbs.csdn.net/topics/370021520

    下面输出结果是多少?

    #include <iostream>
    using namespace std;
    
    int g=0;
    template<typename T>
    int foo(T a)
    {
    static int value = ++g;
    cout<<"输出:"<<a<<" ";
    return value; } int main() { cout<<foo<int>(3)<<foo<bool>(false)<<foo<float>(2.2f)<<foo<bool>(true)<<foo<int>(1)<<foo<char>('T');cout<<endl; return 0; }

    结果是:输出:T 输出:1 输出:1 输出:2.2 输出:0 输出:3     234321

    原因:1.cout操作符的递归调用和从右向左的顺序。   即:比如在 cout<<参数1<<参数2<<....  cout的参数入栈的顺序是参数2、参数1。在入栈之前(return值入栈前,先把相应的函数执行),这也是先打印出  输出:T 的原因

             2.模板中:foo(bool) foo(int )  foo(char) 属于不同函数,有自己的函数栈地址

             3.局部static(在函数内),只进行一次初始化,保存在全局数据区,所以foo<int>(1)执行后value值为2,当下一个foo<int>(3)时,static int value = ++g初始化语句没有执行。所以value仍为2

    总结:1.cout递归调用  2.模板函数的不同  3.局部static的初始化

  • 相关阅读:
    Eclipse JSP/Servlet 环境搭建
    2017 世界主要国家和地区 GDP 排名
    Twsited异步网络框架
    RabbitMQ队列,RedisMemcached缓存
    Paramiko,数据库
    SelectPollEpoll异步IO与事件驱动
    进程,线程,协程
    socketserver模块
    socket
    类的相关知识
  • 原文地址:https://www.cnblogs.com/dust-fly/p/3919548.html
Copyright © 2011-2022 走看看