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

1、对于代码段

1

2

3

float x = 2.5, y = 4.7;

int a = 7;

printf("%.1f", x+a%3*(int)(x+y)%2/4);

的结果为()

A、2.5

B、2.8

C、3.5

D、3.8

答案:A

解析:本题考查的是运算符的优先级问题。在表达式 x+a%3*(int)(x+y)%2/4 中,()的优先级最高,所以先计算 x+y 并进行强制转换,代入值后原式化为:2.5+7%3*7%2/4,这个式子中%、*、/是同级的都大于+,结合性从左到右,所以原式化为:2.5+0(后面最后进行的是两个整数相除,不足1直接舍掉了),所以最后结果为2.5,选择选项A。

2、 以下说法错误的是:

A、指针和引用做为函数参数都可以改变实参

B、指针和引用都可以在定义后任意的改变指向

C、引用必须在创建的时候初始化,而指针则不需要

D、不能空引用,但是可以有空指针

答案:B

解析:引用一旦成为某个变量的别名后,不可以改变指向,故选择选项B。

3、在 C 语言中,引用数组元素时,其数组下标的数据类型允许是(  )。

A、整型常量

B、整型表达式

C、整型变量

D、任何类型的表达式

答案:ABC

解析:仔细读题,区别是定义数组还是引用数组元素。定义数组是不可以用变量,引用数组时,整型常量(a[1]、a[2]......)、整型表达式(a[i+1]、a[i+2])、整型变量(常用循环赋值中,如a[i])均可。

4、C语言中浮点类型数据包括哪些部分()

A、符号位

B、指数位

C、尾数部分

D、整数

E、小数

答案:ABC

解析:本题考查的是浮点数在计算机内部的存储方式,浮点类型数据在计算机内部通常采用IEEE 754标准来表示,根据标准,浮点类型数据包括:符号位、指数位、尾数部分。选择选项ABC。

6、有定义语句int *ptr [4];,下面等价的定义语句是

A、int ** ptr;

B、int( * ptr) [4];

C、int ptr[4];

D、int * (ptr [4]);

答案:D

解析:首先看题目中的定义语句,定义的是一个指针数组,数组中有四个指针。选项A定义的是一个二级指针。选项B定义的是一个数组指针,也叫行指针。选项C定义的是一个普通的一维整型数组。前三个选项都不符合要求,下面来看选项D,由于[ ]的优先级高于*,无论加不加(),ptr都先与[ ]结合。所以D选项的()可以直接去掉,变成与题目中相同的形式,选择选项D。

7、声明一个指向含有10个元素的数组的指针,其中每个元素是一个函数指针,该函数的返回值是int,参数是int*,正确的是()

A、(int *p[10])(int*)

B、int [10]*p(int *)

C、int (*(*p)[10])(int *)

D、int ((int *)[10])*p

E、以上选项都不正确

答案:C

解析:从题目出发开始分析,首先有一个数组指针,假设为int (*p)[10]。然后有一个函数指针数组,假设为int(*s[10])(int *)。因为这个数组指针指向了这个函数指针数组,并且函数指针数组是一个一维数组,有p = &s,即*p = s。下面我将函数指针数组式子进行替换,变成

int(*(*p)[10])(int *)。下面我们从结果来检验一下符不符合题目条件,对于我们得到的式子,根据优先级判断如何结合。首先()的优先级最高,我们先看最里面的(),*和p先结合表明是一个指针。然后(*p)与[10]结合,表示为一个数组指针。然后整体与*结合降级,表示指向的数组是一个一维数组。最后外面加上返回值类型和参数类型,表示这个指向的一维数组是一个函数指针数组。综上,选择选项C。

8、 有如下程序段:

1

2

3

4

5

6

7

#include <stdio.h>

int main() {

    char ch = -1;

    printf(" %02x, %02x", ch, (unsigned char)ch);

    return 0;

}

则输出:

A、-1,-1

B、ff,ff

C、ffffffff,ff

D、ff,ffffffff

答案:C

解析:首先,负数在计算机中要以补码的形式表示,-1的补码为11111111,并利用(unsigned char)将其中一个11111111转换为无符号数。接下来看前面的格式控制符%02x,表示以十六进制输出,至少输出两位,不足的用0补。并且%x默认输出unsigned int,所以会对原来的类型进行扩展,从八位扩展到三十二位。对于这个扩展,无符号数以0在前面填充,有符号数会以符号位在前面填充。所以打印出来应该是ffffffff,ff,选择选项C。

9、 下面程序段的运行结果是()

1

2

3

char s[]="abcdefgh",*p =s; 

p += 3; 

printf("%d\n", strlen(strcpy(p,"ABCD"))); 

A、8

B、12

C、4

D、7

答案:C

解析:首先定义了一个字符串,指针p指向字符串的首地址,然后指针进行偏移。偏移后对于字符串"abcdefgh",指针p指向字母d。先进行的是strcpy,拷贝结束后字符串为"abcABCD",但是返回的字符串为"ABCD",因为它返回的是第一个字符串的首地址,这个地址现在是p指针指向的位置,所以计算有效长度为4,选择选项C。

10、 运行以下C语言代码,输出的结果是()

1

2

3

4

5

6

7

8

9

10

11

12

13

#include <stdio.h>

int main()

{

    char *str[3] ={"stra""strb""strc"};

    char *p =str[0];

    int i = 0;

    while(i < 3)

    {

        printf("%s ",p++);

        i++;

    }

    return 0;

}

A、stra strb strc

B、s t r

C、stra tra ra

D、s s s

答案:C

解析:注意区分 char * p = str[0] 和 char * p = str 的区别,前者将数组中第一个指针赋给指针p,所以指针p指向的是字符串"stra"的首地址,进行移动是一个字符一个字符的移动,所以选择选项C。后者是将数组名(即&str[0])赋给了指针p,指针p指向的是数组中的第一个指针,如果进行p++,那么指针p就会指向数组中下一个指针,此时进行解引用再以%s进行输出,将会输出下一个字符串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值