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的初始化

原文地址:https://www.cnblogs.com/dust-fly/p/3919548.html