目录
第一题(进制打印)
有以下程序
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
int m=0123, n=123;
printf("%o %o\n", m, n);
return 0;
}
程序运行后的输出结果是()
A 0123 0173
B 0123 173
C 123 173
D 173 173
二进制的表示格式 101010b,b一定要在最后!!
八进制的表示格式 01234567,以0开头!
十进制的表示格式 123456789,没有任何前缀和后缀
十六进制的表示格式 0x123或者123h都可以表示16进制
%d:表名数据是以十进制方式输出
%o:八进制方式输出
%x:十六进制方式输出
所以我们代码中的m本身就是一个八进制数据,是不需要将0输出的,直接将123打印出来
然后我们的n是123,没有任何前缀和后缀,就是一个十进制数,要以八进制打印,就是将123转换成八进制173.
C
第二题(二维数组的地址问题)
二维数组X按行顺序存储,其中每个元素占1个存储单元。若X[4][4]的存储地址为Oxf8b82140,X[9][9]的存储地址为Oxf8b8221c,则X[7][7]的存储地址为()。
A Oxf8b821c4
B Oxf8b821a6
C Oxf8b82198
D Oxf8b821c0
不知道总共有多少航,每行有多少列
假设:数组X的起始地址为start,总共有M行,N列
&x[4][4]=start+4*N+4=0xf8b82140
&x[9][9]=start+9*N+9=0xf8b8221c
&x[7][7]=start+7*N+7
我们可以按照上面的二元一次方程组进行运算
&x[4][4]=0xf8b82140
&x[4][9]=0xf8b82145
&x[9][9]=0xf8b8221c
而x[4][9]和x[9][9]刚好相隔了5行
0xf8b8221c-0xf8b82145=5*N
21c-145=D7也就是215十进制,也就是5行中一共有D7个元素,也就是每一行有43个元素
而我们的x[7][7]比x[4][4]多了3*N+3,也就是3*43+3=132,转换成16进制就是84
也就是0xf8b82140加上84就是f8b821c4
A
第三题(二维字符串的相关打印问题)
以下程序的输出结果是:
#include <iostream>
using namespace std;
void func(char **m){
++m;
cout<<*m<<endl;
}
int main(){
static char *a[]={"morning", "afternoon", "evening"};
char **p;
p=a;
func(p);
return 0;
}
A afternoon
B 字符o的起始地址
C 字符o
D 字符a的起始地址
上面的p是一个二级指针,一开始指向a的首元素的地址。
(数组名一般表示数组首元素的地址,只有在&和sizeof之后才表示数组本身!,也就是指针+1会越过整一个数组的地址空间)
也就是**p一开始指向a的首元素的地址"morning",
(morning本身就是一个char*,然后我们要获取这个morning的地址,我们的p就必须是一个二级指针)
然后进入函数调用,让++m,也就是让我们的指针偏移一个元素类型的大小,(a数组中,每一个位置都是一个字符串的地址),所以++之后,就从morning的地址跳转到了afternoon的地址,然后对地址进行解引用,就将afternoon这个内容打印了出来
A
第四题(x&(x-1)的意思)
求函数返回值,输入x=9999
int func(int x){
int count=0;
while (x)
{
count++;
x=x&(x-1);//与运算
}
return count;
}
A 8
B 9
C 10
D 12
假设x=7--->111
第一次循环:count++--->count:1 x=7&6=111&110=110 x=6
第二次循环:count++--->count:2 x=6&5=110&101=100 x=4
第三次循环:count++--->count:3 x=4&3=100&011=0
一共三次循环
也就是x&(x-1)所代表的是x中的二进制中有多少个1
9的二进制是:1001
9999的二进制是10011100001111,一共8个1,所以选A
A
第五题(递归)
#include <stdio.h>
int cnt = 0;
int fib(int n) {
cnt++;
if (n == 0)
return 1;
else if (n == 1)
return 2;
else
return fib(n - 1) + fib(n - 2);
}
void main() {
fib(8);
printf("%d", cnt);
}
下列程序执行后,输出的结果为()
A 41
B 67
C 109
D 177
这里我们关注的是cnt
fib(0)=1
fib(1)=1
fib(2)=fib(0)+fib(1)+1=1+1+1=3
(这里注意,因为在进入fib的时候本身就有cnt++所以fib(2)本身也要++一次,所以计算的时候还要额外+1)
fib(3)=fib(1)+fib(2)+1=1+3+1=5
fib(4)=fib(2)+fib(3)+1=3+5+1=9
fib(5)=fib(3)+fib(4)+1=5+9+1=15
fib(6)=fib(4)+fib(5)+1=9+15+1=25
fib(7)=fib(5)+fib(6)+1=15+25+1=41
fib(8)=fib(6)+fib(7)+1=25+41+1=67
B