一道错误的面试题

  在某论坛看到人问这个题目,在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;
}

在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;
}

所以在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;
}

这种情况的话就是无限第归了.哎,现在的这样的面试题还出有什么意义了.

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值