在某论坛看到人问这个题目,在vc6下实验了一下,结果和他们要的结果一样,然后看了一下汇编代码,才知道怎么回事,昨天上水木,他们也在讨论这个问题,原来这个题目是错误的.
#include<iostream>
using namespace std;
int get_Number(int num)
{
static int _ret_value = get_Number(num+1);
return _ret_value;
}
int main()
{
cout<<get_Number(5);
return 0;
}
using namespace std;
int get_Number(int num)
{
static int _ret_value = get_Number(num+1);
return _ret_value;
}
int main()
{
cout<<get_Number(5);
return 0;
}
在vc6下的汇编代码为:
7: static int _ret_value = get_Number(num+1);
00401568 xor eax,eax
0040156A mov al,[`get_Number'::`2'::$S25 (0047bdee)]
0040156F and eax,1
00401572 test eax,eax
00401574 jne get_Number+49h (00401599)
00401576 mov cl,byte ptr [`get_Number'::`2'::$S25 (0047bdee)]
0040157C or cl,1
0040157F mov byte ptr [`get_Number'::`2'::$S25 (0047bdee)],cl
00401585 mov edx,dword ptr [ebp+8]
00401588 add edx,1
0040158B push edx
0040158C call @ILT+5(get_Number) (0040100a)
00401591 add esp,4
00401594 mov [__pow10neg+0F88h (0047bde8)],eax
8: return _ret_value;
00401599 mov eax,[__pow10neg+0F88h (0047bde8)]原来vc6下是这么处理static变量的初始化的
int get_Number(int num)
{
static int _ret_value = get_Number(num+1);
return _ret_value;
}
int get_Number(int num)
{
static bool _init;
static int _ret_value;
if (!_init)
{
_init = true;
_ret_value = get_Number(num+1);
}
return _ret_value;
}
{
static int _ret_value = get_Number(num+1);
return _ret_value;
}
int get_Number(int num)
{
static bool _init;
static int _ret_value;
if (!_init)
{
_init = true;
_ret_value = get_Number(num+1);
}
return _ret_value;
}
所以在vc6下得到的结果为0,满以为自己找到了答案,但是上水木后才知道,它是不符合标准的,因为它的初始化还有其他的一种可能:
int get_Number(int num)
{
static bool _init;
static int _ret_value;
if (!_init)
{
_ret_value = get_Number(num+1);
_init = true;
}
return _ret_value;
}
{
static bool _init;
static int _ret_value;
if (!_init)
{
_ret_value = get_Number(num+1);
_init = true;
}
return _ret_value;
}
这种情况的话就是无限第归了.哎,现在的这样的面试题还出有什么意义了.
51万+

被折叠的 条评论
为什么被折叠?



