C语言阶段性测试错题纠正与拓展

引言:在2024年4月26日,我进行了C语言知识“期末考试”。通过这次考试,我发现了我的知识漏洞。所以,我写下这篇博客来记录我的错题,并进行纠正,然后对于以前遗忘知识的回顾

更多有关C语言的知识详解可前往个人主页:计信猫

目录

一,选择题

1,第一题

2,第二题

3,第三题

4,第四题

5,第五题

二,编程题

1,第一题

2,第二题

三,遗忘知识的回顾

 1,整型提升和算术提升

Ⅰ,整型提升例题

​编辑 四,勉励自己


一,选择题

1,第一题

 原因分析:在刚看到这道题时,我其实就已经想到了解题的关键,那就是以前所讲到的unsigned char类型的变量的取值范围,如下图:

        可是,就在我进行对i值的不断减三时,我好似发现了一个可以秒杀这道题的地方,那就是unsigned char无符号整型,那这个值i就永远不可能为负数对吧,那退出for循环的条件肯定永远都不会被满足啊,那么不直接就死循环了吗?那答案就是B啊。

        所以这道题我就败在了看题的准确度上,仔细读题,才发现for循环的判断条件是i>0,那么也就意味着,i=0时也可以退出循环

 题目正解:正如前面所提到的unsigned char类型的取值范围只可以为0~255,所以i初始化为7,那么对其不断地减去三,i的值则会如下变化:

        那么每减去一次三,就++j,那么具体的减三次数如下图所示:

        那么2+1+84+1+85=173次,所以答案应该选C。 

2,第二题

原因分析:说实话,这道题错了真该挨巴掌。我当时其实也是分析出来了,x首先为1,经过printf语句后,打印x值为1,之后x加一为2,通过while循环判断条件后x又减一为1,如此往复循环,那么应该是陷入了死循环。但是我当时脑子一抽,认为A选项的1表示的就是死循环的打印1,只是太长了,就没有全部写出来。现在一回想真的是后悔莫及啊!

题目正解:直接上图,不废话了:

        所以如图所示,1,2过程一直循环,始终跳不出while循环,故死循环打印1,答案选D。 

3,第三题

原因分析: 这道题我错的原因是知识点掌握不牢固,感觉每一句话都有模有样很有道理,最后迫不得已扣了字眼,认为D选项不对,一个普普通通的#define的宏定义这么简单的写法,怎么可能比函数(如此强大的工具)效率更高?而事实证明我还是错了,计算机语言做题是十分严谨的,不能去抠字眼,每一道题的答案都要选的有根有据

题目正解:这道题虽然涉及到了C++的语法知识,但是通过排除法还是可以做出来的。从我的笔记来看,我所能归纳出的#define宏的优缺点如下

优点:

1,宏的规模和速度更胜于函数一筹

2,宏的类型与参数的类型无关

缺点:

1,宏在替换时会延长代码

2,宏无法通过调试判断是否出错

3,宏无类型,不严谨

4,宏会带来运算符优先级的问题

        所以根据如上归纳,选项ACD都是对的,那么排除法就是选B。 

4,第四题

 原因分析:这道题的错误原因是知识点掌握错误,而导致了这道题的错误,我的错误笔记如下:

        做这道题时,我还保留着错误的认知,认为int*为4个字节,char*为1个字节,那么不就大小不同吗?所以我就选择了错误答案B(现在错误的笔记已被改正) 

题目正解:我们直接在x86和x64的环境下进行代码实操就行了:

#include <stdio.h>
int main()
{
	printf("%zd\n", sizeof(int*));
	printf("%zd\n", sizeof(char*));
	printf("%zd\n", sizeof(float*));
	printf("%zd\n", sizeof(double*));
	printf("%zd\n", sizeof(short*));
	printf("%zd\n", sizeof(long*));
	return 0;
}

x86环境:

x64环境:

        可以看出,指针变量的大小只与平台有关,32位机为4,64位机则为8。而这道题真正错误的是A选项当我们使用free函数释放掉某个指针所指向的内容时,该指针并不会自动置为NULL,必须我们手动置空。 

5,第五题

原因分析: 这道题错误的原因也是我的知识点掌握不牢固,别无其他原因。

题目正解:我将如下归纳预处理,编译,链接,执行的作用:

一,预处理:展开宏定义,展开头文件,甚至进行更多预处理指令操作(如#error #pragma #line等预处理指令)。

二,编译:将预处理后的⽂件进⾏⼀系列的:词法分析、语法分析、语义分析及优化,发现语法错误,⽣成相应的汇编代码⽂件。

三,链接:地址和空间分配,符号决议和重定位等这些步骤,链接解决的是⼀个项⽬中多⽂件、多模块之间互相调⽤的问题(于此中发现函数未被定义)。

四,执行:不会引发调试器或测试框架,只是简单地启动应用程序并按照程序代码的逻辑执行代码。

二,编程题

1,第一题

题目正解:首先,我们可以使用以前学到的%10来获取数字的最后一位,/10来去掉数字的最后一位,然后,再将所得到的数字以字符的形式储存到字符数组中,并且每隔三个字符,就额外储存一个“,”,最后,我们再将字符串打印出来就可以了。那么代码如下:

#include <stdio.h>
int main()
{
	int input = 0;
	scanf("%d", &input);
	char arr[100] = { 0 };
	int save = 0;
	int i = 0;
	int count = 0;
	while (input)
	{
		if (count != 0 && count % 3 == 0)
		{
			arr[i++] = ',';
		}
		save = input % 10;//获取数字的最后一位
		input /= 10;//删除数字的最后一位
		arr[i++] = save + '0';//将得到的数字以字符形式储存
		count++;
	}
	i -= 1;//在while循环最后一次时,i++使i多了个1,所以要将i减1
	printf("%s", arr);
	return 0;
}

2,第二题

题目正解:对于这道题目,我们的思路就是首先创造两个字符数组,我们将第一个字符数组的每一个字符于第二个字符数组中遍历,如果第二个字符数组中有该字符,则不打印;反之,就打印该字符所以代码如下:

#include<stdio.h>
int is_exist(char ch, char arr[])
{
	int i = 0;
	while (arr[i])
	{
		if (arr[i] == ch)
		{
			//在第二个字符串中
			return 0;
		}
		i++;
	}
	//不在第二个字符串中
	return 1;
}
int main()
{
	char arr1[101] = { 0 };
	char arr2[101] = { 0 };
	//获得字符串放入两个字符数组
	gets(arr1);
	gets(arr2);
	int i = 0;
	while (arr1[i])
	{
		if (is_exist(arr1[i], arr2))
		{
			printf("%c", arr1[i]);
		}
		i++;
	}
	return 0;
}

三,遗忘知识的回顾

 1,整型提升和算术提升

        在考试中,曾有这么一道题:

        而这道题中,就涉及到了整型提升和算术提升的知识点。整型提升:当变量类型的级别低于int时,算数运算时就会将变量的类型提升为int。算术提升:当变量类型的级别高于int时,算数运算时就会将变量的类型提升为更高的类型

        如此,答案为D选项

Ⅰ,整型提升例题

        那我们现在来看一道与整型提升有关的例题:

#include<stdio.h>
int main()
{
	char a = 5;
	char b = 28;
	char sum = a + b;
	printf("%d\n", sum);
	printf("%c\n", sum);
	return 0;
}

        那么这段代码的输出结果是什么呢?

题目解答: 这道题之中,我们将数字228分别赋给字符变量ab,后面再执行a+b并将结果赋值给sum。那么很明显,在相加的时候,就会发生前面是所提到的整型提升

        所以sum=a+b33,再将33对应的阿斯克码值换算出为'!',故打印出的结果如下:

小问题的解答: 在做这道题时,其实我就会想到一个问题,我们使用字符类型来定义变量a,b和sum,为什么我们却使用整型变量来初始化它们呢?这不就乱套了吗?

        其实,这样初始化并没有错误。因为在计算机中,任何数据都是以二进制代码进行储存的,而每一个字符都有自己对应的阿斯克码值阿斯克码值不就是整型数字吗?那么我们就可以理解为其实字符变量类型储存的其实也是数字,所以我们拿整型对某个字符变量初始化并无不妥

        请注意!如下两种初始化是有区别的!

#include<stdio.h>
int main()
{
	char a = 0;//将数字0初始化a,0的阿斯克码值所对应的字符为NULL(无法被打印)
	char b = '0';//将字符0初始化b
	printf("%c\n", a);
	printf("%c\n", b);
	return 0;
}

        代码一走,结果如下:

 四,勉励自己

        虽然这次考试成绩不理想,但是经过这次的写博客进行总结,感觉学到了很多东西,越来越上道了

        虽然这篇博客的技术含量不高,但是对我来说意义重大这篇博客不仅让我搞懂了以前没有搞懂的知识,并且还让我有了以前上高中时,对着自己没考好的数学卷子改错纠错记错题的感觉,这种记错题的好习惯真的让我受益匪浅。加油吧,每天学习一点点,百万年薪正等着我呢!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

什么是摇摆交易?澳福一篇文章全面解读

摇摆交易是八大外汇交易策略其中一种交易策略。摇摆交易基于这样的想法&#xff0c;交易者希望利用波动范围和趋势市场的优势&#xff0c;通过选择“顶部”和“底部”&#xff0c;交易者可以相应地输入多头和空头头寸。即可以应用局部校正来最大化利润。fpmarkets澳福认为这种交…

P5931 灯泡

题目描述 相比 Wildleopard 的家&#xff0c;他的弟弟 Mildleopard 比较穷。他的房子是狭窄的&#xff0c;而且在他的房间里仅有一个灯泡。每天晚上&#xff0c;他徘徊在自己狭小的房子里&#xff0c;思考如何赚更多的钱。有一天&#xff0c;他发现他的影子的长度随着他在灯泡…

【Python的魅力】:利用Pygame实现游戏坦克大战——含完整源码

文章目录 一、游戏运行效果二、代码实现2.1 项目搭建2.2 加载我方坦克2.3 加载敌方坦克2.4 添加爆炸效果2.5 坦克大战之音效处理 三、完整代码 一、游戏运行效果 二、代码实现 坦克大战游戏 2.1 项目搭建 本游戏主要分为两个对象&#xff0c;分别是我方坦克和敌方坦克。用户可…

人工智能技术在教育中的潜力有多大

原文&#xff1a;人工智能技术在教育中的潜力有多大&#xff1f; - 知乎 作者&#xff1a;大全Prompt 链接&#xff1a;https://www.zhihu.com/question/637034129/answer/3346272227 来源&#xff1a;知乎 谢邀&#xff1a;在技术快速发展的今天&#xff0c;人工智能&#x…

数据复制的艺术:深拷贝与浅拷贝在JavaScript中的实现方式

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热爱技术和分享&#xff0c;欢迎大家交流&#xff0c;一起学习进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 目录 赋值和拷贝 浅拷贝与深拷贝区别 浅拷贝的实现方式 1.Object.assign() 2.…

变革 Perplexica:AI驱动的问答搜索引擎

Perplexica是一个开源的人工智能搜索工具&#xff0c;也可以说是一款人工智能搜索引擎&#xff0c;它深入互联网以找到答案。受Perplexity AI启发&#xff0c;它是一个开源选择&#xff0c;不仅可以搜索网络&#xff0c;还能理解您的问题。它使用先进的机器学习算法&#xff0c…

国产Sora诞生!清华团队发布Vidu大模型,可直接生成16秒视频

大模型之争已从单模态转向多模态。 4月27日&#xff0c;在2024中关村论坛年会未来人工智能先锋论坛上&#xff0c;清华大学联合北京生数科技有限公司正式发布了文生视频大模型——Vidu。 在会议上&#xff0c;清华大学人工智能研究院副院长、生数科技首席科学家朱军对外展示了…

windows11家庭版开启Hyper-v

前提&#xff1a;如果在控制面板中-->程序和功能-->启用和关闭windows功能-->没有Hyper-v 1.什么是Hyper-v&#xff1f; Hyper-v分为两个部分&#xff1a;底层的虚拟机平台、上层的虚拟机管理软件 2.Hyper-v安装 2.1新建hyper.cmd文件&#xff0c;写入下面的内容&…

C++初阶-----对运算符重载的进一步理解(2)

目录 1.对于加加&#xff0c;减减运算符的重载理解 2.const修饰的一些事情 3.日期对象之间的减法实现逻辑 1.对于加加&#xff0c;减减运算符的重载理解 &#xff08;1&#xff09;在C语言里面&#xff0c;我们已经知道并且了解加加&#xff0c;减减的一些基本的用法&#…

RepeatMasker 基因组重复区域文件

rmsk.txt 一般关注标红的几列, 各列含义: Schema for RepeatMasker - Repeating Elements by RepeatMasker "rmsk.txt" 是 UCSC Genome Browser 提供的一个文件,用于描述重复序列的注释信息。通常,它包含了以下列: 1. **bin**:UCSC Genome Browser 使用的染色…

笔记:编写程序,绘制一个展示 2013~2019 财年阿里巴 巴淘宝+天猫平台的 GMV 的柱形图,实现过程如下:

文章目录 前言一、GMV 的柱形图是什么&#xff1f;二、编写代码总结 前言 编写程序。根据实例 2 的要求&#xff0c;绘制一个展示 2013~2019 财年阿里巴 巴淘宝天猫平台的 GMV 的柱形图&#xff0c;实现过程如下&#xff1a; &#xff08;1&#xff09; 导入 matplotlib.pypl…

2024中国(江西)国际先进陶瓷材料及智能装备博览会

2024中国&#xff08;江西&#xff09;国际先进陶瓷材料及智能装备博览会 “中国&#xff08;江西&#xff09;国际先进陶瓷材料及智能装备博览会” 陶瓷三新展 &#xff08;新材料、新装备、新技术&#xff09; 绿色智能、引领未来 2024年11月1日-11月3日 中国江西 南昌…

生活服务推出品牌实惠团购,覆盖五一假期“吃喝玩乐”多场景

4月26日&#xff0c;抖音生活服务平台上线“跟着大牌过五一”活动会场&#xff0c;携手22家连锁品牌商家&#xff0c;于“五一”前推出优价团购和时令新品&#xff0c;覆盖“吃喝玩乐”多重购物需求&#xff0c;助力假期消费。同时&#xff0c;伴随各地涌现的文旅热潮&#xff…

项目:使用LNMP搭建私有云存储

目录 项目&#xff1a;使用LNMP搭建私有云存储 准备工作 回复快照&#xff0c;关闭安全软件 上传软件 设置nextcloud安装命令权限 设置数据库 重启数据库 配置nginx 安装 内网穿透 cpolar的域名信任 项目&#xff1a;使用LNMP搭建私有云存储 准备工作 回复快照&a…

C#上位机与S7-200Smart通信注意事项

S7-200SMART连接 问题描述 我们使用C#开发上位机和S7-200Smart系列PLC交互数据时&#xff0c;大多会用到Sharp7、Snap7之类的通信类库。有些通信类库默认的使用的是PG连接资源&#xff0c;而对于S7-200Smart来说&#xff0c;它的PG连接资源只有1个。 官网200smart提到的连接数…

解决idea不识别${pageContext.request.contextPath}的方法

文章目录 一、产生原因二、解决方法——直接修改web.xml文件三、修改模板——找到web.xml模板&#xff0c;修改替换 一、产生原因 由于web.xml 使用的web-app版本号过低。导致无法识别"{pageContext.request.contextPath}"。 IDEA在创建javaweb项目的时候&#xff0…

imx6ull配置交叉编译环境编译u-boot及linux所遇问题解决记录

文章目录 前言一、问题 1 及解决方法1、问题 1 描述2、问题 1 解决方法 二、问题 2 及解决方法1、问题 2 描述2、问题 2 解决方法 三、问题 3 及解决方法1、问题 3 描述2、问题 3 解决方法 四、问题 4 及解决方法1、问题 4 描述2、问题 4 解决方法 前言 CoM-iMX6UL(L) 是一款兼…

笔记:能量谱密度与功率谱密度(二)

目录 一、ESD与PSD的定义、单位、性质 二、对ESD与PSD的直观理解 三、总结&#xff1a; 某物理量的“分布”在离散系统中&#xff0c;各点(纵坐标含义&#xff09;的物理意义仍然是该物理量&#xff0c;而在连续系统中&#xff0c;各点&#xff08;纵坐标含义&#xff09;的物…

react报错:Warning: Each child in a list should have a unique “key“ prop.

我是万万没想到的&#xff0c;使用Popconfirm不添加key属性也会报错&#xff1a; react-refresh:160Warning: Each child in a list should have a unique "key" prop. Check the render method of Cell. Seehttps://reactjs.org/link/warning-keys for more informa…

STM32点灯大师(点了一颗LED灯,轮询法)

配置操作&#xff1a; 一、使用CubeMX配置到大致的操作 1.1 选择芯片 1.2 选择引脚&#xff08;根据电路图&#xff09; 1.3 配置gpio口 1.4 配置系统 1.5文件项目操作 最后就是点击 二、点击CubeMX生成的代码&#xff0c;并且修改代码 2.1 看看效果 2.2 写代码