一次有趣的小实验,大家进来讨论一下!
在学习C++的过程中,遇到了一个函数互调问题,即:函数互调问题。给个例子:#include <iostream>
using namespace std;
int one(int x);
int two(int y);
int main()
{
int i=1;
one(i); //调用one(int x)函数
return 0;
}
int one(int x)
{
cout<<"one()执行了"<<x/2<<"次"<<endl;
x++;
two(x); //调用two(int x)函数
return 0;
}
int two(int y)
{
cout<<"two()执行了"<<y/2<<"次"<<endl;
y++;
one(y); //调用one(int x)函数
return 0;
}
在主函数中调用了one(int x)函数,one(int x) 函数又调用了 two(int y)函数,同样的two(int y)函数里面又调用one(int x)函数,如此循环的调用下去,理论上这样可以无限循环,但是在编译的时候 最多每一个函数调用只执行了5871次!起初我以为是编译器(我用的是vc++6.0编译器)有“保护措施”,于是又写了一段无限循环的代码,代码如下:
#include <iostream>
using namespace std;
int main()
{
int i;
for(i=1;i!=0;i++)
cout<<"执行了"<<i<<"次"<<endl;
return 0;
}
编译这段代码的时候,是无限循环,一直执行了几十万次也没有停止。初步排除了计算机硬件(一般是指内存)的问题。然后又改成以下代码试了一下:
#include <iostream>
using namespace std;
int main()
{
int i;
for(i=1;i!=0;i+=1000000)
cout<<"执行了"<<i<<"次"<<endl;
return 0;
}
在i的值溢出的情况下,代码段仍然一直执行,然后基本排除了数据溢出导致函数互调停止的可能性。
现在问题出来了:
1:是什么问题导致函数互调停止的?
2:每个调用的函数执行次数跟哪些因素有关?还是一个确定的值?