题目1:两个二进制数的异或结果是多少?
分析:
同一位置上所相应的数值不同,则异或输出的判定值为真——“1”,同一位置上所相应的数值同样。则异或输出的判定值为假——“0”。
为了方便记忆。因此。能够记成两个数差的绝对值。
题目2:递归函数终于会结束,那么这个函数一定(不定项选择):
1.使用了局部变量
2.有一个分支不调用自身
3.使用了全局变量或者使用了一个或多个參数
分析:
1.显然不是。局部变量仅仅在一次调用局部范围有效,出了这次调用的范围就无效了,因此不能控制递归的结束(注:此选项是考察局部变量的生命周期和有效范围,同一时候须要注意局部变量不是局部静态变量)。
2.显然正确。3.使用全局变量或者使用了一个或多个參数的确能够控制递归函数的结束,但不仅仅是仅仅有这两种方式。题目中有“一定”。因此我们仅仅选择2。其他能够控制递归的结束的因素能够有:
(1) 局部静态变量
局部静态变量能够控制递归的结束。由于局部静态变量存放在堆中而不是栈中,它的生命周期存在于整个程序内,仅仅是仅仅有在函数内才干被訪问,其内容是上次处理后的内容或是被初始化之后的内容,调用多次都是同一个变量实例。值得注意的是局部静态变量不同于全局变量,由于全局变量的生命周期和作用域都存在全局性,而局部静态变量仅仅有生命周期存在全局性。
(2) 异常
能够通过异常来控制递归的结束。如堆栈的溢出、内存不足以及除零等。
(3) 全局变量
能够通过全局变量来控制递归的结束。如日期时间等。
题目3:下面函数的结果是什么?
int cal(int x) { if(x==0) return 0; else return 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。