刷c语言练习题6(牛客网)

1、下面函数的功能是( )

1

2

3

4

5

6

int sss(char s[], char t[])

{

    int i = 0;

    while(s[i] && t[i] && (t[i] == s[i])) i++;

    return (s[i] - t[i]);

}

A、求字符串的长度

B、比较两个字符串的大小

C、将字符串s复制到字符串t中

D、将字符串s接续到字符串t中

答案:B

解析:本题定义函数中传入两个指针,根据形式应该分别指向两个字符串。定义循环变量后,while循环中前两个条件的含义是遍历这两个字符串到'\0'位置结束,第三个条件是判断两字符串的对应位置是否是相同字符。循环结束后要么两个字符串相等,要么两个字符串不等,此时返回两字符串结束位置字符的ASCII码差。所以函数功能是比较两个字符串的大小,选择选项B。

2、 下列选项,不正确的是

A、for(int a=1;a<=10;a++);

B、int a=1; do { a++; }while(a<=10)

C、int a=1; while(a<=10) { a++; }

D、for(int a=1;a<=10;a++)a++;

答案:B

解析:本题考查的是基本语法,do while语句末尾需要加分号,int a=1; do { a++; }while(a<=10);(√),所以选择选项B。

3、

1

2

3

4

unsigned char *p1;

unsigned long *p2;

p1 = (unsigned char *)0x801000;

p2 = (unsigned long *)0x810000;

请问p1+5= 什么?p2+5= 什么?

A、801005 810005

B、801005 810020

C、801005 810014

D、801010 810014

答案:C

解析:本题考查的是指针的偏移,指针偏移是以其指向的类型大小为单位的。例如:int * p,指针p指向的类型为int,所以执行 p+n,指针p会移动 n*sizeof(int)大小的空间。在本题中,p1指针指向的是unsigned char,+5移动5*sizeof(unsigned char)大小的空间,p2指针的移动同理。本题还需注意将移动的大小转为16进制,sizeof(unsigned long)一般为4字节,所以本题选择选项C。

4、 在16位C编译系统上,以下程序的输出结果是().

1

2

3

4

5

void main()

{

int y=2456;

printf ("y=│%3o│ y=│%8o│y=│%#8o│ y=│%08o│",y,y,y,y);

}

A、y=│2456│ y=│□□□□2456│ y=│□□□02456│ y=│00002456│

B、y=│4630│ y=│□□□□4630│ y=│□□□04630│ y=│00004630│

C、y=│2456│ y=│□□□□2456│ y=│###02456│ y=│00002456│

D、y=│4630│ y=│4630□□□□│ y=│###04630│ y=│00004630│

答案:B

解析:代码中首先定义了一个int型变量并赋值为2456,这个数据是十进制数据。下面的输出都是以八进制输出的,将2456转换为八进制为4630,排除选项A、C。%3o限制域宽为3,数据实际长度为4,所以会原样输出数据。%8o限制域宽为8,会自动补空格,对其方式为右对齐。%#8o在%8o的基础上会显示进制输出。%08o相较于%8o的不同是前面自动补0。综上,选择选项B。

5、 定义符号常量pi。const float pi= 3.1415926f; 这句话是否正确

A、正确

B、错误

答案:A

解析:常量在定义初始化时可以进行赋值操作,并且这句代码符合语法规则,选择选项A。

6、 在x86的机器上执行:

1

2

int a = 0xabcd1234; 

char b = ((char*)&a)[0];

请问b是多少

A、0xa

B、0x4

C、0xab

D、0x34

答案:D

解析:阅读题目后,通过x86机器这一信息可以得到:存储方式为小端存储,即低位存在低地址,高位存在高地址。char * 得到a地址中一个字节的大小的空间,由于是小端存储,则这段空间中存的是0x34,由于[0]与*可以互换,所以[0]将数据0x34取出赋值给b,b的值为0x34,选择选项D。

7、 

1

2

unsigned int a = 0x1234;

unsigned char b = *(unsigned char *)&a; 

在 32 位大端模式处理器上变量 b 等于()

A、0x00

B、0x12

C、0x34

D、0x1234

答案:A

解析:32位处理器上,unsigned int 占4个字节,变量a=0x1234即0x0000 1234。下面定义了一个指向unsigned char空间大小的指针,由于是大端存储,故指向地址中的内容为0x00,所以解引用后赋给变量b的值为0x00,选择选项A。

8、 代码段

1

2

3

4

5

6

7

8

#include <stdio.h>

int main() {

    int i = 1;

    sizeof(i++);

    printf("%d\n", i);

    return 0;

}

的输出为()

A、1

B、4

C、2

D、8

答案:A

解析:sizeof内的运算没有意义,不会执行。计算机会在编译时将sizeof(i++)翻译成sizeof(i++的数据类型),所以本题i最后的值为1,选择选项A。

9、 在32位小端的机器上,如下代码输出是什么:

1

2

3

4

5

char array[12] = {0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08};     

 short *pshort = (short *)array;     

 int *pint = (int *)array;     

 int64 *pint64 = (int64 *)array;     

 printf("0x%x , 0x%x , 0x%llx , 0x%llx", *pshort , *(pshort+2) , *pint64 , *(pint+2));

A、0x201 , 0x403 , 0x807060504030201 , 0x0

B、0x201 , 0x605 , 0x807060504030201 , 0x0

C、0x201 , 0x605 , 0x4030201 , 0x8070605

D、0x102 , 0x506 , 0x102030405060708 , 0x0

答案:B

解析:由于采用小端存储,所以低位存放低地址,高位存放高地址。所以将数组元素按从高位到低位可以写成0x0807060504030201,指针pshort指向的类型是short类型,占两个字节,所以第一个输出应该是0x201。*(pshort+2)是pshort指针向高地址移动两个short类型占的空间,所以现在指向的0506所在的地址,第二个输出为0x605。*pint64所指向的类型是int64,占八个字节,又因为它指向的是数组首地址,故第三个输出为0x807060504030201。

*(pint+2)中,指针pint指向的类型是int,占四个字节,移动前指向数组首地址,移动后正好越过了已经赋值的数组区域,因为数组是部分初始化,没有赋值的区域会自动赋0,所以第四个输出为0x0。综上,选择选项B。

10、 不能把字符串"HELLO!"赋给数组b的语句是()

A、char b[10] = {'H','E','L','L','O','!','\0'};

B、char b[10];b = "HELLO!";

C、char b[10];strcpy(b,"HELLO!");

D、char b[10] = "HELLO!";

答案:B

解析:数组名是一个常量,不能被赋值。故选择选项B。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值