面试题积累(一)

来源:互联网 发布:经传软件账号密码 编辑:程序博客网 时间:2024/06/04 08:44

题目1:两个二进制数的异或结果是多少?

分析:

       同一位置上所对应的数值不同,则异或输出的判定值为真——“1”,同一位置上所对应的数值相同,则异或输出的判定值为假——“0”。为了方便记忆,因此,可以记成两个数差的绝对值。


题目2:递归函数最终会结束,那么这个函数一定(不定项选择):

            1.使用了局部变量

            2.有一个分支不调用自身

            3.使用了全局变量或者使用了一个或多个参数

分析:

         1.显然不是,局部变量只在一次调用局部范围有效,出了这次调用的范围就无效了,因此不能控制递归的结束(注:此选项是考察局部变量的生命周期和有效范围,同时需要注意局部变量不是局部静态变量)。2.显然正确。3.使用全局变量或者使用了一个或多个参数的确可以控制递归函数的结束,但不仅仅是只有这两种方式,题目中有“一定”,因此我们只选择2。其它可以控制递归的结束的因素可以有:

(1) 局部静态变量

     局部静态变量可以控制递归的结束,因为局部静态变量存放在堆中而不是栈中,它的生命周期存在于整个程序内,只是只有在函数内才能被访问,其内容是上次处理后的内容或是被初始化之后的内容,调用多次都是同一个变量实例。值得注意的是局部静态变量不同于全局变量,因为全局变量的生命周期和作用域都存在全局性,而局部静态变量只有生命周期存在全局性。

(2) 异常

     可以通过异常来控制递归的结束。如堆栈的溢出、内存不足以及除零等。

(3) 全局变量

     可以通过全局变量来控制递归的结束。如日期时间等。


题目3:以下函数的结果是什么?

            

int cal(int x){if(x==0)return 0;elsereturn x+cal(x-1)}

分析:

        此题若输入大于等于0,则结果返回从该数到0的所有整数之和,若输入小于0,则无限递归。


题目4:以下程序的结果是什么?

            

void foo(int* a, int* b){*a=*a+*b;*b=*a-*b;*a=*a-*b;}void main(){int a=1, b=2, c=3;foo(&a,&b);foo(&b,&c);foo(&c,&a);printf("%d, %d, %d", a,b,c);}


分析:

        实现互换操作,a=1, b=3, c=2。















0 0
原创粉丝点击