在某论坛看到人问这个题目,在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)]
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;
}
这种情况的话就是无限第归了.哎,现在的这样的面试题还出有什么意义了.