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减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.xdnf.cn/news/1411352.html

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

相关文章

VMware虚拟机中ubuntu使用记录(5)—— 如何在ubuntu中安装USB相机ros驱动并获取usb摄像头数据

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、ROS下USB相机驱动1.准备工作(1) 下载驱动(2) 创建ROS工作空间 2. 安装usb_cam驱动(1) 安装usb_cam驱动包(2) 编译代码 3. 修改usb_cam驱动的配置文件(1) 查看US…

设计模式之组合实体模式

在编程的奇幻森林里&#xff0c;树木与枝叶错综复杂&#xff0c;如何让代码世界井然有序&#xff1f;组合实体模式&#xff08;Composite Pattern&#xff09;就像一位高明的园艺师&#xff0c;它以一种巧妙的方式&#xff0c;将个体与整体统一管理&#xff0c;让无论是单个对象…

古典密码学简介

目录 C. D. Shannon: 一、置换密码 二、单表代替密码 ① 加法密码 ② 乘法密码 ③密钥词组代替密码 三、多表代替密码 代数密码 四、古典密码的穷举分析 1、单表代替密码分析 五、古典密码的统计分析 1、密钥词组单表代替密码的统计分析 2、英语的统计规…

刷代码随想录有感(54):二叉搜索树中的搜索(BST)

题干&#xff1a; 代码&#xff08;递归实现&#xff09;&#xff1a; TreeNode* searchBST(TreeNode* root, int val){if(root NULL || root-> val val)return root;TreeNode* res;if(val > root->val) res searchBST(root->right, val);if(val < root->…

Redis 实战之对象

Redis 实战 - 对象 对象的类型与编码类型编码和底层实现 字符串对象编码的转换字符串命令的实现 列表对象编码转换列表命令的实现 哈希对象编码转换哈希命令的实现 集合对象集合命令的实现 有序集合对象编码的转换有序集合命令的实现 类型检查与命令多态类型检查的实现多态命令…

工业光源-半环形光源-特点

产品特点 ◆高密度LED排列&#xff1b; ◆应用于特殊结构的安装与出光方向&#xff1b; ◆从180方向照射&#xff0c;消除阴影&#xff1a; ◆中间开孔&#xff0c;使光源与相机镜头完美契合&#xff1a; ◆多角度可选&#xff0c;可适应不同工作距离的应用&#xff1b; ◆可选…

c++11 标准模板(STL)本地化库 - 平面类别(time_get) - 从输入字符序列中解析时间/日期值到 std::tm 中(八)

本地化库 本地环境设施包含字符分类和字符串校对、数值、货币及日期/时间格式化和分析&#xff0c;以及消息取得的国际化支持。本地环境设置控制流 I/O 、正则表达式库和 C 标准库的其他组件的行为。 平面类别 从输入字符序列中解析时间/日期值到 std::tm 中 std::time_get …

算法学习系列(五十五):背包模型(三)

目录 引言一、潜水员二、背包问题求具体方案三、机器分配四、开心的今明五、金明的预算方案 引言 今天介绍的是背包模型&#xff0c;还是以题目的形式来介绍的。主要讲了背包问题求方案&#xff0c;就是由最优方案递推回去即可。还有就是一些比较经典的背包问题&#xff0c;其…

Sqlserver批量迁移Job

因为切换物理机&#xff0c;需要把数据库的作业从A机器迁移到B机器&#xff0c;数据库整体备份还原就可以了&#xff0c;数据库上的作业不会跟着带过去&#xff0c;需要手动创建&#xff0c;作业数量太多&#xff0c;逐一创建太浪费时间&#xff0c;Microsoft SQL Server Manag…

【LLM多模态】MiniGPT4模型结构和训练流程

note 图生文应用场景&#xff1a;比如电商领域根据产品图像生成产品描述、娱乐领域中根据电影海报生成电影介绍等MiniGPT-4将预训练的大语言模型和视觉编码器参数同时冻结&#xff0c;只需要单独训练线性投影层&#xff0c;使视觉特征和语言模型对齐。MiniGPT4的视觉编码器&am…

使用docker-compose编排Lnmp(dockerfile) 完成Wordpress

目录 一、 Docker-Compose 1.1Docker-Compose介绍 1.2环境准备 1.2.1准备容器目录及相关文件 1.2.2关闭防火墙关闭防护 1.2.3下载centos:7镜像 1.3Docker-Compose 编排nginx 1.3.1切换工作目录 1.3.2编写 Dockerfile 文件 1.3.3修改nginx.conf配置文件 1.4Docker-Co…

【前端学习——防抖和节流+案例】

定义 【前端八股文】节流和防抖 防抖 连续触发事件但是在设定的一段时间内只执行最后一次 代码实现思路【定时器】 大概意思就是&#xff1a; 每次按起键盘后&#xff0c;都将之前的定时器删除&#xff0c;重新开始计时。 节流 连续触发事件&#xff0c;只执行一次 …

Web APIs 学习归纳8---移动端特效

上一节学习了PC端的特效&#xff0c;现在学习移动端的特效。 一、移动端触屏事件 1.1 触屏事件概述 移动端浏览器兼容性较好&#xff0c;我们不需要考虑以前 JS 的兼容性问题&#xff0c;可以放心的使用原生 JS 书写效果&#xff0c;但是移动 端也有自己独特的地方。比如触屏…

【Linux网络】SSH服务

目录 一、SSH概述与使用 1.1 定义 1.2 优点 1.3 原理 1.4 命令登录 1.5 跳板登录 1.6 远程控制 二、SSH配置 2.1 常用的服务端配置 2.2 ssh服务最优配置 三、免密登录 3.1 操作原理 3.2 操作步骤 一、SSH概述与使用 1.1 定义 SSH&#xff08;Secure Shell&#…

宝塔怎么配置nginx

宝塔怎么配置nginx 1.找到nginx配置位置 2.修改nginx.conf文件 3.重启nginx

kali 网络环境设置

一、修改网卡配置 1.1 系统桌面上单击右键&#xff0c;在弹出的菜单中选择 Open Terminal Here。 1.2 输入命令 vim /etc/network/interfaces&#xff0c;显示配置网卡参数为。iface lo 一般指 本地环回接口&#xff0c; iface eth0 网卡为系统正在使用的网卡&#xff0c;其中的…

openGauss学习笔记-274 openGauss性能调优-实际调优案例03-建立合适的索引

文章目录 openGauss学习笔记-274 openGauss性能调优-实际调优案例03-建立合适的索引274.1 现象描述274.2 优化分析 openGauss学习笔记-274 openGauss性能调优-实际调优案例03-建立合适的索引 274.1 现象描述 查询与销售部所有员工的信息&#xff1a; SELECT staff_id,first_…

【Java从入门到精通】Java 异常处理

在 Java 中&#xff0c;异常处理是一种重要的编程概念&#xff0c;用于处理程序执行过程中可能出现的错误或异常情况。 异常是程序中的一些错误&#xff0c;但并不是所有的错误都是异常&#xff0c;并且错误有时候是可以避免的。 比如说&#xff0c;你的代码少了一个分号&…

LEETCODE LCR 041. 数据流中的移动平均值

class MovingAverage:def __init__(self, size: int):"""Initialize your data structure here."""self.sizesize1self.front0self.rear0self.queue[None for _ in range(size1)]self.sum0def next(self, val: int) -> float:# 满了if (self.…

平平科技工作室-Python-超级玛丽

一.准备图片 放在文件夹取名为images 二.准备一些音频和文字格式 放在文件夹media 三.编写代码 import sys, os sys.path.append(os.getcwd()) # coding:UTF-8 import pygame,sys import os from pygame.locals import* import time pygame.init() # 设置一个长为1250,宽为…