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

news/2024/5/19 23:10:32

引言:在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减1printf("%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初始化bprintf("%c\n", a);printf("%c\n", b);return 0;
}

        代码一走,结果如下:

 四,勉励自己

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

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


http://www.mrgr.cn/p/42756002

相关文章

TextMeshPro - 富文本标签

初始文本 粗体<b></b> 斜体<i></i> 颜色<#ff0000></color> 大小<size></size> <size=60%>中</size><size=1.2em>中</size> 下划线<u></u> 删除线<s></s> 上标<sup…

通信录的动态版本

一. 增加需求 在学习了动态开辟内存之后 我们对于通讯录产生了新的需求 要求我们做出一个动态增长的版本 即 随着我们储存联系人的增加 储存的空间增加 要求 &#xff1a; 1 初始空间为3 2 每次达到上限之后 扩容两个内存 二. 动手实施 我们首先要创建一个结构体 结构体…

C#中.net8WebApi加密解密

尤其在公网之中&#xff0c;数据的安全及其的重要&#xff0c;除过我们使用jwt之外&#xff0c;还可以对传送的数据进行加密&#xff0c;就算别人使用抓包工具&#xff0c;抓到数据&#xff0c;一时半会儿也解密不了数据&#xff0c;当然&#xff0c;加密也影响了效率&#xff…

Linux 中 2>1 解释

在Linux系统中: 0 表示标准输入; 1表示标准输出; 2表示标准错误输出; 2>&1 表示将标准错误输出重定向到标准输入; 举一个例子: a、不将标准错误输出 重定向到标准输入中。[root@PC1 gffread-0.12.7.Linux_x86_64]# xxx ## 在终端随机输入一个命…

基于SpringBoot的饭店外卖平台的设计与实现

项目描述 这是一款基于SpringBoot的饭店外卖平台的系统 模块描述 用户端 登录 首页 商家信息 点餐 菜品列表 下单 订单列表 账号下单列表 个人中心 个人资料 修改信息 评论管理 评论菜品 查看评论 打赏骑手 打赏骑手 管理员 登录 菜品管理 修改 下架 订单列表 下单记录 菜品管理…

用Docker 创建并运行一个MySQL容器

可以在DockerHub官网上荡:mysql - Official Image | Docker Hub 指令是:docker pull mysql; 因为文件比较大可能时间比较长&#xff0c;我是跟着黑马的课走的 课程提供的有文件&#xff0c;我就用已有的资源了。 在tmp目录里放入mysql.tar包 然后cd进去 输入指令:docker lo…

Day 26 数据库日志管理

数据库日志管理 一&#xff1a;日志管理 1.日志分类 ​ 错误日志 &#xff1a;启动&#xff0c;停止&#xff0c;关闭失败报错。rpm安装日志位置 /var/log/mysqld.log ​ 通用查询日志&#xff1a;所有的查询都记下来 ​ 二进制日志&#xff1a;实现备份&#xff0c;增量备份…

谷歌推出10门免费AI课程,无需教科书及费用

谷歌面向小白以及开发者分别推出了不同的AI课程~ 包含初级、中级和高级。课程章节大致包括&#xff1a;&#xff08;含教学视频、参考材料、测验&#xff09; 基础入门&#xff1a;45分钟深入了解生成式AI 简单实操&#xff1a;30分钟掌握大语言模型 了解如何释放生成式 AI S…

《十九》Qt Http协议及实战

前言 本篇文章来给大家讲解QT中的Http协议&#xff0c;Http协议主要用于网络中数据的请求和响应&#xff0c;那么这篇文章将给大家讲解一下这个协议。 一、HTTP概述 HTTP&#xff08;超文本传输协议&#xff09;是互联网上应用最为广泛的协议之一&#xff0c;它定义了客户端…

【Linux 基础 IO】文件系统

文章目录 1.初步理解文件2.C语言环境下的文件操作2.1 C库中 fopen、fwrite 的讲解2.2 C文件操作的实例 3.系统调用接口的讲解 1.初步理解文件 &#x1f427;① 打开文件&#xff1a; 本质是进程打开文件&#xff0c;只有程序运行起来文件才被打开&#xff1b; &#x1f427;②文…

文件IO的学习

FAT32与NTFS文件系统的区别;MMU内存管理单元;Linux内核的功能;Linux目录和文件的存储方式;IO编程 概述 了解FAT32 和 NTFS文件系统是操作系统用于明确磁盘或者分区上文件的方法和数据结构。 一块硬盘就像一个块空地,文件就像不同的材料,我们首先得在空地上建起仓库(分区…

OpenResty

原文:https://www.cnblogs.com/liekkas01/p/12757576.htmlcosocket 是各种 lua-resty-* 非阻塞库的基础,没 有 cosocket,开发者就无法用 Lua 来快速连接各种外部的网络服务。 在早期的 OpenResty 版本中,如果想要去与 Redis、memcached 这些服务交互的话,需要使用 redis2-…

线上线下收银一体化,新零售POS系统引领连锁门店数字化转型-亿发

在市场竞争日益激烈的背景下&#xff0c;没有哪个商家能够永远屹立不倒。随着互联网技术的快速发展&#xff0c;传统的线下门店面临着来自电商和新零售的新型挑战。实体零售和传统电商都需要进行变革&#xff0c;都需要实现线上线下的融合。 传统零售在客户消费之后就与商家失…

KAN: Kolmogorov–Arnold Networks

KAN: Kolmogorov–Arnold Networks 论文链接&#xff1a;https://arxiv.org/abs/2404.19756 代码链接&#xff1a;https://github.com/KindXiaoming/pyKAN 项目链接&#xff1a;https://kindxiaoming.github.io/pyKAN/intro.html Abstract 受Kolmogorov-Arnold表示定理的启…

使用jdbc方式操作ClickHouse

1、创建测试表&#xff0c;和插入测试数据 create table t_order01(id UInt32,sku_id String,total_amount Decimal(16,2),create_time Datetime ) engine MergeTreepartition by toYYYYMMDD(create_time)primary key (id)order by (id,sku_id);insert into t_order01 values …

cannot execute binary file

001、问题,调用一个二进制文件,出现如下的报错[root@PC1 gffread-0.12.7.OSX_x86_64]# ls gffread [root@PC1 gffread-0.12.7.OSX_x86_64]# ./gffread -bash: ./gffread: cannot execute binary file 002、问题原因 出现如上报错的原因通常是: 该错误发生时,通常是在尝试执…

SSH远程管理服务

什么是SSH服务器&#xff1f; SSH&#xff08;Secure Shell&#xff09;是一种安全通道协议&#xff0c;主要用来实现字符界面的远程登录、远程 复制等功能。SSH 协议对通信双方的数据传输进行了加密处理&#xff0c;其中包括用户登录时输入的用户口令&#xff0c;SSH 为建立在…

buuctf-pwn-[第五空间2019 决赛]PWN5-格式化字符串漏洞

题目地址:https://buuoj.cn/challenges#[第五空间2019 决赛]PWN5 先检查一下保护情况再拖进ida里分析找到一个格式化字符串漏洞,那么我们可以利用这个漏洞去获取或者改写dword_804C044的值 从而进入if语句中,拿到shell 什么是格式化字符串漏洞 所谓格式化字符串漏洞,就是我…

使用 GPT-4-turbo+Streamlit+wiki+calculator构建Math Agents应用【Step by Step】

&#x1f496; Brief&#xff1a;大家好&#xff0c;我是Zeeland。Tags: 大模型创业、LangChain Top Contributor、算法工程师、Promptulate founder、Python开发者。&#x1f4dd; CSDN主页&#xff1a;Zeeland&#x1f525;&#x1f4e3; 个人说明书&#xff1a;Zeeland&…

极验4 一键解混淆

提示&#xff01;本文章仅供学习交流&#xff0c;严禁用于任何商业和非法用途&#xff0c;未经许可禁止转载&#xff0c;禁止任何修改后二次传播&#xff0c;如有侵权&#xff0c;可联系本文作者删除&#xff01; AST简介 AST&#xff08;Abstract Syntax Tree&#xff09;&a…