C语言练习4(巩固提升)

news2024/9/29 13:19:34

C语言练习4

    • 选择题

前言
 面对复杂变化的世界,人类社会向何处去?亚洲前途在哪里?我认为,回答这些时代之问,我们要不畏浮云遮望眼,善于拨云见日,把握历史规律,认清世界大势。

选择题

1、如果 x=2014 ,下面函数的返回值是( )

int fun(unsigned int x)
{
	int n = 0;
	while (x + 1)
	{
		n++;
		x = x | (x + 1);
	} 
	return n;
}
int main()
{
	printf("%d\n", fun(2014));
	return 0;
}

A: 20 B: 21 C: 23 D 25

💯答案解析:

😸正确答案:C
这个作用是对整型中0的个数进行统计,x=x|(x+1);的作用是每次循环把x的二进制中从右往左数的最后一位0变成1,直道变成全1的时候x+1就溢出为全0,循环结束。2014的二进制是0000 0000 000 0000 0000 0111 1101 1110,所以结果是23
在这里插入图片描述

2、下列语句定义 x 为指向 int 类型变量 a 的指针,其中哪一个是正确的( )
A: int a , *x = a; B: int a , *x = &a; C: int *x = &a , a; D: int a , x = a;
💯答案解析:

😸正确答案:B
A选项的x是指针,赋值时使用a不合适,C选项在赋值时a变量还没定义,D选项中的x不是指针。

3、下面有关空指针和未初始化指针,说法错误的是( )
A: 对0x0这个地址取值是非法的
B: 空指针可以确保不指向任何对象或函数; 而未初始化指针则可能指向任何地方
C: 空指针与任何对象或函数的指针值都不相等
D: malloc在其内存分配失败时返回的是一个未初始化的指针
💯答案解析:

😸正确答案:D
malloc函数在内存分配失败时返回NULL,其余选项都正确

4、若有定义 int a[8]; ,则以下表达式中不能代表数组元素 a[1] 的地址的是( )
A: &a[0]+1 B: &a[1] C: &a[0]++ D: a+1
💯答案解析:

😸正确答案:C
D选项a计算时是首元素地址,再加1,就是a[1]的地址,AB明显对,C选项malloc函数在内存分配失败时返回NULLa[0]先和++结合,形成一个表达式,不能对表达式取地址,会报错

5、以下选项中,对基本类型相同的两个指针变量不能进行运算的运算符是( )
A: + B: - C: = D: ==
💯答案解析:

😸正确答案:A
A错误,因为两个地址相加无意义也可能越界,所以规定不允许指针相加。B选项,可以求出两个数据元素储存位置之间的相隔同数据类型的元素个数,C选项,赋值,没问题,D选项,判断两指针是否相同

6、有以下函数,该函数的功能是( )

int fun(char* s)
{
	char* t = s;
	while (*t++);
	return(t - s);
}

A: 比较两个字符的大小 B: 计算s所指字符串占用内存字节的个数
C: 计算s所指字符串的长度 D: 将s所指字符串复制到字符串t中
💯答案解析:

😸正确答案:B
循环在*t为0时停止,同时t++,t最后会停在字符串结束的’\0’之后的一个位置,t作为尾部指针减去头部指针就是整个字符串占用内存的字节数,包含\0在内;而c答案字符串长度不包括最后的\0

7、若有“ float a[3]={1.5,2.5,3.5},pa=a;(pa++)*=3; ”,则 *pa 的值是( )
A: 1.5 B: 2.5 C: 3.5 D: 4.5
💯答案解析:

😸正确答案:B
pa=a中指针pa指向a[0];pa++返回值仍是操作之前的值;(pa++)取pa指向的地址的值;(pa++)=3将该值变为原来的3倍,也就是数组a的第一个值为4.5;由于pa++之后pa指针移动了sizeof(float)个字节,所以pa指向a[1],所以值为2.5

8、以下程序运行后的输出结果是( )

#include <stdio.h>
int main()
{
	int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }, * p = a + 5, * q = NULL;
	*q = *(p + 5);
	printf("%d %d\n", *p, *q);
	return 0;
}

A: 运行后报错 B: 6 6 C: 6 11 D: 5 10
💯答案解析:

😸正确答案:A
指针q初始化为NULL,接着又解引用指针q,是错误的,对NULL指针是不能解引用的

9、设有定义 char *p[]={“Shanghai”,“Beijing”,“Honkong”}; 则结果为 j 字符的表达式是( )
A: *p[1] +3 B: *(p[1] +3) C: *(p[3] +1) D: p[3][1]
💯答案解析:

😸正确答案:B
B选项,p是个char*类型的数组,p[1]拿到字符串"beijing"的首地址,再加3便是’j’的地址,解地址拿到’j’

10、以下叙述中正确的是( )
A: 即使不进行强制类型转换,在进行指针赋值运算时,指针变量的基类型也可以不同
B: 如果企图通过一个空指针来访问一个存储单元,将会得到一个出错信息
C: 设变量p是一个指针变量,则语句p=0;是非法的,应该使用p=NULL;
D: 指针变量之间不能用关系运算符进行比较
💯答案解析:

😸正确答案:B
A 选项描述不正确,不同类型指针一般不可以直接赋值;C选项中,p=NULL;和p=0;是等价的;D选项中,指向同一数组的两指针变量进行关系运算可表示它们所指数组元素之间的位置关系。B选项正确

11、有如下代码,则 *(p[0]+1) 所代表的数组元素是( )

int a[3][2] = {1, 2, 3, 4, 5, 6}, *p[3];
p[0] = a[1];

A: a[0][1] B: a[1][0] C: a[1][1] D: a[1][2]
💯答案解析:

😸正确答案:C
p是一个指针数组,p[0] = a[1];此处a[1]是二维数组的第二行的数组名,数组名表示首元素的地址,a[1]是a[1][0]的地址,所以p[0]中存储的是第2行第1个元素的地址,p[0]+1就是第二行第2个元素的地址,*(p[0]+1)就是第二行第二个元素了。所以C正确。

12、关于指针下列说法正确的是【多选】( )
A: 任何指针都可以转化为void * B: void *可以转化为任何指针
C: 指针的大小为8个字节 D: 指针虽然高效、灵活但可能不安全
💯答案解析:

😸正确答案:ABD
C选项,指针占几个字节要看平台,64位环境下8个字节,32位环境下4个字节

13、以下 scanf 函数调用选项中, 错误的是( )

struct T
{
	char name[20];
	int age;
	int sex;
} a[5], * pa = a;

A: scanf(“%s”,a[0].name); B: scanf(“%d”, &pa[0].age);
C: scanf(“%d”,&(pa->age)); D: scanf(“%d”, pa->age);
💯答案解析:

😸正确答案:D
该题考察的是通过scanf函数的调用对结构体数据类型进行初始化。scanf(“输入控制符”, 输入参数);功能:将从键盘输入的字符转化为“输入控制符”所规定格式的数据,然后存入以输入参数的值为地址的变量中。scanf输入时要通过地址找空间,B、C用了&是正确的。name属于字符数组的数组名,相当于数组的首地址,A正确。单独的pa->age可用于输出语句获取值的形式,用在scanf中的时候需要&操作符,D错误

14、如下函数 fun 计算 prod=123*…*n ,并返回计算结果值。但当 n>12 时,返回值不正确。
误,正确的调试方法是( )

int fun(int n)
{
	int prod = 1, i = 0;
	for (i = 1; i <= n; i++)
	{
		prod *= i;
	} 
	return prod;
}

A: 监视变量prod的值,在prod *= i;行处设置断点,然后单步运行,直到发现错误原因
B: 监视变量prod的值,在return prod;行处设置断点,程序中断后,即可发现错误原因
C: 在prod=1;处设置断点,然后在函数调用堆栈中即可发现错误原因
D: 监视变量i的值,在for (i=1; i<=n; i++)行处设置断点,然后单步运行,直到发现错误原因
💯答案解析:

😸正确答案:A
依题目已知情况,当n<=12时结果是正确的,说明是随着参数的变大计算过程中哪里出了问题,故而要在prod *= i;处设断点,查看原因。错误原因是数据过大时整型溢出

15、下列给定程序中,函数 fun 的功能是:把形参a所指数组中的奇数按原顺序依次存放到a[0]、a[1]、a[2]… 中,把偶数从数组中删除,奇数个数通过函数值返回。 例如,若a所指数组中的数据最初排列为: 9,1,4,2,3,6,5,8,7 ,删除偶数后,a所指数组中的数据为: 9,1,3,5,7 ,返回值为5。请在程序的下画线处填入正确的内容并将下画线删除,使程序得出正确的结果( )

int fun(int a[], int n)
{
	int i, j;
	j = 0;
	for (i = 0; i < n; i++)
		if (a[i] % 2 == _________)
		{
			a[j] = a[i];
			_________;
		} 
	return _________;
}

A: 0 j++ j B: 1 j++ j+1 C: 0 j++ j+1 D: 1 j++ j
💯答案解析:

😸正确答案:D
代码实现的思路应该是arr[i]是奇数的时候要存储起来,所以第一个空是1,最开始j是0,每次找到一个奇数就存储到arr[j]的位置,那接下里j需要+1,所以得第二个空是j++,当循环停止的时候,j其实就是奇数的个数。所以最后返回j,第三个空是j。所以选D。

16、指出下列代码的缺陷【多选】( )

float f[10];
// 假设这里有对f进行初始化的代码
for (int i = 0; i < 10;)
{
	if (f[++i] == 0)
		break;
}

A: for(int i = 0; i < 10;)这一行写错了 B: f是float型数据直接做相等判断有风险
C: f[++i]应该是f[i++] D: 没有缺陷
💯答案解析:

😸正确答案:BC
一般float型只能精确到小数后六位(即1e-6),将float型数据的绝对值与1e-6比较,来判断是否相等(为零)。float的精度误差在1e-6;double精度误差在1e-15;所以要判断一个float型数:if(fabs(f)<1e-6);要判断一个double型数:if(fabs(f)<1e-15);若满足,则为零。考虑B选项是对的。若要判断float a,b是否相等,要看if(fabs(a-b)<1e-6)是否为真。C选项,考虑的是数组越界问题

17、请指出以下程序的错误【多选】( )

void GetMemory(char** p, int num)
{
	if (NULL == p && num <= 0)//1
		return;
	*p = (char*)malloc(num);
	return;
} 
int main()
{
	char* str = NULL;
	GetMemory(&str, 80); //2
	if (NULL != str)
	{
		strcpy(&str, "hello"); //3
		printf(str); //4
	} 
	return 0;
}

A: 1 B: 2 C: 3 D: 4
💯答案解析:

😸正确答案:AC
第1处两种情况之一成立都是要返回的,应该用或,此处用与错误。在语句GetMemory(&str,100);中传入str的地址,在语句char*str=NULL;中str初始化为空指针,但是str指针变量也有地址,所以参数char**p里面的p保存的是指针变量str的地址,所以调用GetMemory函数之后,动态开辟的空间的地址存放在了str中,在函数返回之后没有释放内存,但是这不会导致程序错误,只会导致内存泄漏。第3处用&str是错的,应该直接用str,是刚申请下来的空间首地址,可以用来接收字符串的copy。

18、请问下列代码的输出结果有可能是哪些【多选】( )

#include <stdio.h>
typedef union
{
	int a;
	struct
	{
		short b;
		short c;
	};
}X;
int main()
{
	X x;
	x.a = 0x20150810;
	printf("%x,%x\n", x.b, x.c);
	return 0;
}

A: 2015,810 B: 50810,201 C: 810,2015 D:`20150,810
💯答案解析:

😸正确答案:AC
对于0x20150810
如果按照大端模式存储:从低地址到高地址:20 15 08 10 输出从低地址到高地址:20 15 08 10
如果按照小端模式存储:从低地址到高地址:10 08 15 20 输出从高地址到低地址:08 10 20 15
此数以int类型赋值给联合体x.a,而以结构成员b和c分开访问,分别拿到低地址的2个字节和高地址的2个字节,大端下是2015和810,小端下是810和2015

19、下面这个程序执行后会有什么错误或者效果【多选】( )

#define MAX 255
int main()
{
	unsigned char A[MAX], i;
	for (i = 0; i <= MAX; i++)
		A[i] = i;
	return 0;
}

A: 数组越界 B: 死循环 C: 栈溢出 D: 内存泄露
💯答案解析:

😸正确答案:AB
数组下标越界:数组大小255,但是当a[255]就是256个元素,导致越界了。死循环:这个是因为无符号字符型的变量大小在0-255之间,所以说i永远不可能大于255的,是个死循环。内存泄漏:创建的临时变量,在栈中,应该会由系统自动释放,所以应该是不存在内存泄漏的问题。栈溢出:属于缓冲区溢出的一种。栈溢出是由于C语言系列没有内置检查机制来确保复制到缓冲区的数据不得大于缓冲区的大小,因此当这个数据足够大的时候,将会溢出缓冲区的范围

20、请问下列程序的输出是多少( )

#include<stdio.h>
int main()
{
	unsigned char i = 7;
	int j = 0;
	for (; i > 0; i -= 3)
	{
		++j;
	}
	printf("%d\n", j);
	return 0;
}

A: 2 B: 死循环 C: 173 D: 172
💯答案解析:

😸正确答案:C
本题就是找规律,计算什么时候能遇到0
unsigned char 8位数据位,范围在0-255,所以-2(11111110)时,变成254;同理-1(11111111)时,变成255;最后减到0时,不满足循环条件,for停止。刚好173次。
7 4 1 ==> 共(7-1)/3+1=3次(1-3=-2,即254,继续循环)
254 251 … 5 2 ==> 共(254-2)/3+1=85次(2-3=-1,即255,继续循环)
255 252 … 6 3 ==> 共(255-5)/3+1=85次(3-3=0,退出循环) 所以总共173次
在这里插入图片描述

💘后期会推出更多C语言练习题,希望大家与我共同进步,早日成为大佬!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/933446.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设计模式--适配器模式(Adapter Pattern)

一、什么是适配器模式&#xff08;Adapter Pattern&#xff09; 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许将一个类的接口转换成客户端所期望的另一个接口。适配器模式主要用于解决不兼容接口之间的问题&#xff0c;使得原本…

小研究 - Java虚拟机性能及关键技术分析

利用specJVM98和Java Grande Forum Benchmark suite Benchmark集合对SJVM、IntelORP,Kaffe3种Java虚拟机进行系统测试。在对测试结果进行系统分析的基础上&#xff0c;比较了不同JVM实现对性能的影响和JVM中关键模块对JVM性能的影响&#xff0c;并提出了提高JVM性能的一些展望。…

[Go版]算法通关村第十四关白银——堆高效解决的经典问题(在数组找第K大的元素、堆排序、合并K个排序链表)

目录 题目&#xff1a;在数组中找第K大的元素解法1&#xff1a;维护长度为k的最小堆&#xff0c;遍历n-k个元素&#xff0c;逐一和堆顶值对比后&#xff0c;和堆顶交换&#xff0c;最后返回堆顶复杂度&#xff1a;时间复杂度 O ( k ( n − k ) l o g k ) O(k(n-k)logk) O(k(n−…

大数据治理运营整体解决方案[39页PPT]

导读&#xff1a;原文《大数据治理运营整体解决方案[39页PPT]》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 数据治理总体方案 数据治理平台解决方案 数据治理运…

nginx生成自定义证书

1、创建key文件夹 [rootlocalhost centos]# mkdir key 进入key文件夹 [rootlocalhost centos]# cd key/ 2、生成私钥文件 [rootlocalhost key]# openssl genrsa -des3 -out ssl.key 4096 输入这个key文件的密码。不推荐输入&#xff0c;因为以后要给nginx使用。每次reload ngin…

yolov8热力图可视化

安装pytorch_grad_cam pip install grad-cam自动化生成不同层的bash脚本 # 循环10次&#xff0c;将i的值从0到9 for i in $(seq 0 13) doecho "Running iteration $i";python yolov8_heatmap.py $i; done热力图生成python代码 import warnings warnings.filterwarn…

如何延长周末体验感

美好的周末永远都是从周五开始 为了享受周末的美好时光一定要在周五下班前把工作中应该处理的事情处理好&#xff0c;避免突发事件影响后续的计划。 此外过周五晚上开始做让自己感到开心的事情&#xff0c;以此让自己感觉到周末已经开始了。包括单不限于 享受美食 周五晚上是一…

【业务功能篇84】微服务SpringCloud-ElasticSearch-Kibanan-电商实例应用

一、商品上架功能 ElasticSearch实现商城系统中全文检索的流程。 1.商品ES模型 商品的映射关系 PUT product {"mappings": {"properties": {"skuId": {"type": "long"},"spuId": {"type": "ke…

mall:redis项目源码解析

文章目录 一、mall开源项目1.1 来源1.2 项目转移1.3 项目克隆 二、Redis 非关系型数据库2.1 Redis简介2.2 分布式后端项目的使用流程2.3 分布式后端项目的使用场景2.4 常见的缓存问题 三、源码解析3.1 集成与配置3.1.1 导入依赖3.1.2 添加配置3.1.3 全局跨域配置 3.2 Redis测试…

DataFrame.set_index()方法--Pandas

1.函数功能 为DataFrame重新设置索引&#xff08;行标签&#xff09; 2. 函数语法 DataFrame.set_index(keys, *, dropTrue, appendFalse, inplaceFalse, verify_integrityFalse)3. 函数参数 参数含义keys作为行标签的列名&#xff0c;可以DataFrame中的是单个列或者多列组…

【实例分割】(一)Mask R-CNN详细介绍带python代码

目录 1.&#x1f340;&#x1f340;实例分割定义 2.&#x1f340;&#x1f340;Mask R-CNN 3.&#x1f340;&#x1f340;经典的实例分割算法 4.&#x1f340;&#x1f340;Mask R-CNN python代码 整理不易&#xff0c;欢迎一键三连&#xff01;&#xff01;&#xff01;…

【FreeRTOS】【应用篇】任务管理相关函数

文章目录 前言一、函数解析1. 任务挂起 vTaskSuspend()① 使用场景② 设计思路③ 代码 2. 任务恢复 vTaskResume()① 作用② 设计思路③ 代码 3. 挂起任务调度器 vTaskSuspendAll()① 作用② 代码 4. 恢复任务调度器 xTaskResumeAll()① 设计思路② 代码 5. 任务删除函数 vTask…

牡丹宣言:七种皮肤类型|教你如何区分和保姆级护肤大法

经常听到有人说&#xff0c;我的皮肤T区油&#xff0c;脸颊干&#xff0c;应该是混合型皮肤吧 正常的皮肤根据皮脂腺分泌油脂量的多少可分为&#xff1a;中性&#xff0c;干性&#xff0c;油性&#xff0c;混合性。 接下来小编就帮大家细化整理了七种不同的皮肤类型&#xff0c…

Nginx详解 第一部分:编译安装Nginx+Nginx模块

Part 1 一 、HTTP 和 Nginx1.1 套接字Socket1.2 URL1.2.1 定义1.2.1 URL和URN的区别1.2.3 URL组成 1.3 请求访问完整过程详解 二、I/O模型 处理高并发的时候用2.1 I/O模型简介2.2 多路复用I/O型2.3 异步I/O模型2.4 事件模型 select poll epoll 三、NGINX概述3.1 简介3.2 NGINX和…

【Java并发】聊聊对象内存布局和syn锁升级过程

对象存储解析&#xff1a;一个空Object对象到底占据多少内存&#xff1f; 对象内存布局 Mark Word占用8字节&#xff0c;类型指针占用8个字节&#xff0c;对象头占用16个字节。 好了&#xff0c;我们来看一下一个Object对占用多少空间&#xff0c; 因为java默认是开启压缩…

帆软只是一个BI厂商?答案是“No”!

大数据产业创新服务媒体 ——聚焦数据 改变商业 2023年&#xff0c;8月17-19日&#xff0c;帆软智数大会落子花城广州&#xff0c;邀请了1200海内外CIO和数字化专家&#xff0c;共同探讨数字化转型新机遇。 值得关注的是&#xff0c;这也是帆软首次以BI和零代码双赛道第一的身…

django开发流程

设计model django采用ORM映射&#xff0c;可以在代码中描述数据库的布局 只需要导入from django.db import models 并使类继承models.Model&#xff0c;models中的一个类对应数据库中的一个表&#xff0c;类的变量对应表字段。 创建数据库 $ python manage.py makemigration…

Ubuntu【系统环境下】【编译安装OpenCV】【C++调用系统opencv库】

Ubuntu【系统环境下】【编译安装OpenCV】【C调用系统opencv库】 前言&#xff1a; 本人需要用C写代码&#xff0c;调用OpenCV库&#xff0c;且要求OpenCV版本号大于4.1.0 由于使用的是18.04的版本&#xff0c;所以apt安装OpenCV的版本始终是3.2.0&#xff0c;非常拉胯&#…

python爬虫的js逆向入门到进阶教程文章分享汇总~持续更新

目录 一、内容介绍二 、专栏内容-持续更新1、JS逆向入门2、Js逆向进阶3、爬虫基础知识4、工具与安装5、漫星内容分享 三、星球使用四、b站up主视频推荐 一、内容介绍 二 、专栏内容-持续更新 1、JS逆向入门 2023-08-25》11.常见加密>xx音乐RSA加密 https://articles.zsxq.c…

电视乱收费致200元电视也无人买,广电总局出手了,用户拍手欢迎

各个互联网企业盯着电视用户&#xff0c;将用户当韭菜&#xff0c;收费太狠&#xff0c;导致国内市场的电视销量暴跌&#xff0c;消费者怨声载道&#xff0c;日前国家广播电视台联合其他部门开展专项整治&#xff0c;狠杀这类乱收费的乱象&#xff0c;或许将有望挽回用户。 近几…