c语言题(1)

来源:互联网 发布:java中poi是什么意思 编辑:程序博客网 时间:2024/05/16 17:32

1.下列函数定义中,有语法错误的是() 
A.void fun(int x,int *y) 
{x* = *y;} 
B.int *fun(int *x,int y) 
{return x+=y;} 
C.void fun(int *x,int y) 
{*x += y;} 
D.void fun(int x,int *y) 
{*x = *y;} 
这道题首先要明确指针的作用以及指针的用法,指针保存一个地址,整型浮点型数据不能随意加*,因为整型这些类型的值和指针的关系是由指针解引用得到的,所以D错,x为整型不能作为地址被解引用。 
答案:D

2.给出以下定义,下列哪些操作是合法的() 
const char* p1 = “hello”; 
char* const p2 = “world”;

A.p1++; 
B.p1[2] = ‘w’; 
C.p2[2] = ‘l’; 
D.p2++;

这道题要明确const具体修饰指针哪个位置的作用,const char* p = char const *p; 
它代表将指针指向的内容常量化,即内容不能被修改;而char *const p则代表,p当前的地址不能修改,而它的内容可以修改,所以p1不能执行赋值,p2不能执行指针移动。 
答案: A 
3.下面结构体 
struct s1 

char ch,*ptr; 
union 

short a,b; 
unsigned int c:2,d:1; 
}; 
struct s1 *next; 
}; 
sizeof(struct s1)是(): 
A.12字节 
B.16字节 
C.20字节 
D.24字节 
结构体不同的类型写前写后是有不同的大小的,它涉及内存对齐,具体请参考C和指针还有C语言深度剖析都有讲到,而联合体Union由于所有变量共用一份空间,即取最大字节类型变量的大小即可。因为内存对齐,char ch,ptr*因为指针4个字节,则ch原本占一个字节为了对齐也创建4个字节即共8个字节,联合体里最大为整型4个字节,最后一个结构体类型指针4个字节(所有指针都是4个字节,在32为操作系统)。 
答案:B

4.下面程序,求count的值是() 
int func(int x) 

int count = 0; 
x = 9999; 
while(x) 

count++; 
x = x&(x-1); 

return count; 

A.8 
B.10 
C.5 
D.11 
这是一道设计位运算的题,这个程序将x转化为2进制,看含有的1的个数。9999&9998,9998&9997,每执行一次x = x&(x-1),会将x用二进制表示时最右边的一个1变为0,从1到k-1位全是1,按位与的结果自然就是第k位和1~k-1位都变成0。9999二进制应该为10011100001111,所以应该为8个1 
答案:A 
5以下代码打印的结果是()(假设在i386系列计算机上)(): 
struct st_t 

int status; 
short *pdata; 
char errstr[32]; 
}; 
struct st_t st[16]; 
char p = (char )(st[2].errstr + 32); 
printf(“%d”,(p-(char*)st)); 
A.32 
B.114 
C.120 
D.1112 
此时这个p指针知道了结构体数组第三个末尾则一个结构体数组元素40个字节,3个120个字节 
答案:C 
6.以下代码执行后,val的值为(): 
unsigned long val = 0; 
char a = 0x48; 
char b = 0x52; 
val = b << 8 | a; 
A.20992 
B.21064 
C.72 
D.0 
我们来看一下编译器VS2008给出的反汇编代码 
val = b << 8 | a; 
003D13D4 movsx eax,byte ptr [b] 
003D13D8 shl eax,8 
003D13DB movsx ecx,byte ptr [a] 
003D13DF or eax,ecx 
003D13E1 cdq 
003D13E2 mov dword ptr [val],eax 
003D13E5 mov dword ptr [ebp-8],edx 
我们可以发现,char类型左移并不妨碍越界,因为它们是把值放在寄存器里然后再寄存器运算,而寄存器占4个字节,所以0x52二进制01010010左移8位0101001000000000,0x48(01010010前面补八个0)就是0000000001001000,答案转为十进制为21064 
答案:B

7。设有定义:char *p; 
,以下选项中不能正确将字符串赋值给字符型指针P的语句是() 
A.p = getchar(); 
B.scanf(“%s”,p); 
C.char s[] = “China”;p = s; 
D.*p = “china”;

定义这个指针并没有赋值,所以它是一个野指针,所以B根本不能写进去,D更不能赋值,A也是错的,标准输入之前没有初始化指针。 
答案:ABD 
8.在64位系统下,分别定义如下两个变量: 
char *p[10]; 
char(*p1)[10]; 
请问sizeof(p)和sizeof(p1)分别值为() 
A.4,40 
B.80,8 
C.10,10 
D.8,80 
E.40,4 
F.4,4 
在64位系统下指针为8个字节,第一个p为指针数组,每个元素为指针,占4个字节,则sizeof(p)为40,第二个为数组指针,它是一个指针所以sizeof(p1)占8个字节。 
9.用十进制计算30!(30的阶乘),将结果转换成3进制表示的话,该进制下的结果末尾会有()个0 
A.6 
B.8 
C.10 
D.12 
E.14 
F.16 
十进制转三进制就是%3后所得余数在从后往前读出,30!三进制就是看1-30里面每个因子有多少个因数3,3,6,9(3*3)有两个3,12,15,18(3*3*2)有个三,21,24(3*8,4*3*2)两个3,27有三个三. 
答案:E

10.设x,y,t均为int型变量,则执行语句: 
t=3; 
x=y=2; 
t=x++ | ++y;后,变量t和y的值分别为() 
A.t=1 y=2 
B.t=1 y=3 
C.t=2 y=2 
D.t=2 y=3 
E.t=3 y=2 
F.t=3 y=3 
这道题考的是运算符的优先级,自增运算符运行级别大于赋值运算符(赋值运算符优先级很低),而且同一个级别内 逻辑运算符比赋值运算符优先级高。所以x++ | ++y为1,t =1;而逻辑或运算前面为真后面就不执行则,y= 2; 
答案:A

11.使用一辆卡车运输n块单块1TB装满数据的硬盘,以时速80km/h行驶1000km将数据运送到目的地;卡车至少运送()块硬盘才能使运输速率超1000Gbps 
A 2000 
B 3000 
C 4000 
D 5000 
E 6000 
F 7000 
我们平时链接的宽带100M其实是100Mbps,而下载的速度10Mps,因为1B = 8b, 
首先把时间换算成s,1000/80*3600 = 45000s, 
1000 * 8(这是1T的容量换算成GB的位数)*n/45000 = 1000 
n =6000 
答案:E

12.test.c文件包含如下语句: 
#define PTR int* 
typedef int* int_ptr; 
INT_PTR a,b; 
int_ptr c,d; 
文件定义的四个变量,哪个变量不是指针类型? 
A a 
B b 
C c 
D d 
E 都是指针 
F 都不是指针 
宏定义为字符替换,它不是一种类型 
而typedef是将原有类型定义为新的名字,是类型 
所以INT_PTR a,b a是指针,b是整型。 
答案:B

13.假设在n进制下,下面的等式成立,567*456=150216,n值是() 
A.9 
B.10 
C.12 
D.18 
这道题考的是进制转换我们可以列一个等式算出n值,(5*n^2+6*n^1+7)*(4*n^2+5*n+6)=1*32+5*16+0+2*4+1*2+6 
算出来n = 18 
答案:D 
14.有如下规约: 
digit->0|1|…|9 
digit->digit digit* 
optionalFraction->.digits| 
optionalExponent->(E+|-|digits)| 
number ->digits optionalFraction optionlExponent 
对于上面给出的正则规约描述,下列无符号数中,不符合规约要求的是() 
A.5280 
B.1 
C.2.0 
D.336E 
这道题看起来很没有头绪,这道题从最后一个来看,它包含了上面几行的约定,所以推断应该是一个筛选合格约定的数字我们来看一看,5280里面的数字选数首先5280符合0-9,digit*是意思组合5280就是5 2 8 0组合起来,optionalFraction可以加.当作小数,5280可以为5280.可以为5280,optionalExponent意思是有E后面就要有加减运算,1和2.0也符合,只有336E后面没+/-。所以D错 
答案:D

15.int Fun(int x,int y) 

return (x&y) + (x^y)>>1; 

则运行Fun(729,271);结果是() 
A.499 
B.500 
C.501 
D.502 
这道题从左边括号看,(x&y),按位与相同为1,我们可以认为这步运算是把他们相同的部分取出来,然后(x^y),异或把不同的位数取出来为1右移一位,剩下为0,两个相加,相同的部分取一份,不同的部分除2,就是求平均数。 
答案:B