【C语言深度剖析——第一节(关键字1)】《C语言深度解剖》+蛋哥分析+个人理解

你未曾见过火光,难怪甘愿漂泊寒夜
本文由@睡觉待开机原创,未经允许不得转载。
本内容在csdn网站首发
欢迎各位点赞—评论—收藏
如果存在不足之处请评论留言,共同进步!

首先简单介绍一下《C语言深度解剖》:

在这里插入图片描述

全书特点:

主要讲了C语言中的大部分重点内容。
这是一本市面上比较小众的书籍,篇幅简短却涵盖了C语言中大部分的重点内容,讲的比较深入。缺点也有哈,就是里面有部分错误,并且部分内容讲的很突兀,感觉前后连贯性比较差。

适合人群:

《C语言深度解剖》是一本很好的C语言进阶书籍,建议对C语言有一些了解的人群进行阅读。

获取渠道:

这本书目前纸质版市面上是没有的,电子版作者是免费提供的,可以自己去网上找资源。当然,有同学想要看这本书的话可以私信我免费分享给你。

本系列博客介绍

下面就开始正题切入了,本系列博客是对本书+蛋哥分析+自我理解的笔记博客,有下面一些优点:
1.补充了一些C语言相关内容:为了弥补全书内容少部分内容的问题,有些重点没有,所以做了一些补充。
2.进行了明确的详细的分析:本书重点虽然明确,但是因为本书讲的有些难懂,因而本博客里直接明确出来。
3.找出并修改所有错误:本书中存在一些错误和不准确的地方,本系列博客将错误陈述明确并且改正。

本系列博客的讲述形式不是完全按照书本的顺序,而是作者我按照自认为的重点并结合书的顺序重新进行了排版和规划,删改了原书中的部分内容,并加以分析说明。旨在取其精华而去其糟粕。

本节博客内容简介

本节博客主要是围绕关键字这一主题进行分析与解释,本节会有一些关键字相关的衍生概念与定义,了解了本节内容之后,会对C语言的掌握有一个很大的提升。

1.第一个C程序(程序启动的本质及其大概原因)

这个其实就是我们刚开始学习C语言时候学习的第一个C语言程序,问好世界

#include<stdio.h>//预处理int main()
{printf("hellow world!\n");return 0;
}//运行程序的方式,可以直接在vs当中ctrl+f5启动
//也可以在vs中生成二进制可执行程序执行程序,双击运行
//所以,我们需要明确一件事情:我们是负责写程序的人,而编译器是把我们写的文本文件编译链接成为二进制可执行程序

//运行程序的方式,可以直接在vs当中ctrl+f5启动
//也可以在vs中生成二进制可执行程序执行程序,双击运行
在这里插入图片描述
上面就是vs帮我们生成的二进制可执行程序,双击即可执行。
//所以,我们需要明确一件事情:我们是负责写程序的人,而编译器是把我们写的文本文件编译链接成为二进制可执行程序,也就是说,文本程序->(经过编译和链接)->二进制可执行程序。
在这里,我想说的其实是我们启动运行程序的本质是什么?
我们启动程序的本质就是把程序数据加载到内存当中,让计算机进行计算并运行(换言之,任何程序在运行前都需要被加载到内存当中)。
为什么启动程序需要把数据加载到内存当中?在这里大体给大家解释一下(下图为数据在计算机各部分的逻辑图)原因在于快!
在这里插入图片描述
在解释之前,首先科普一下计算机硬件的一个常识,计算机的cpu中的寄存器单价最贵效率最高,内存单价较贵效率较高,硬盘单价便宜,效率低。
在这里插入图片描述

原因在于程序原本不用的时候是存储在计算机硬盘当中的,为了快速读取程序,计算机先把程序放到内存当中,之后进一步使电脑cpu对内存中的程序数据进行读取,之所以不会让cpu直接去硬盘中读取数据,在于去硬盘读取数据很慢,而在内存中读取数据比较快捷。
注:至于为什么运行程序需要加载到内存中的具体原因,请看后续内容

2.变量的定义与声明

变量的定义是什么?

所谓定义,本质上就是在内存中开辟特定大小的空间。

怎么进行变量定义?

int x = 10;
char c = 'a';

明确初始化与赋值概念的不同

初始化:指的是变量与生俱来的内容属性
赋值:指的是后来某个值放到该变量空间的内容属性
两者的注意点在于初始化只能够进行一次,赋值却可以进行无数次。

那我想问,为啥要进行变量定义啊?

首先,我们需要明确的是计算机是弥补人类计算能力低下问题诞生的(这里并没有贬低人类的意思,就是说人类跟计算机相比计算能力确实相对来说比较差)
之后,我们需要明白,我们人类计算时候是需要一步一步计算的,计算机也是需要进行先后计算了,并不是一下子就对所有数据进行处理,计算机也是对一个一个数据进行依次处理的,至于为什么算个数字那么快,因为计算机算的快而已,这并不是说计算机对所有数据进行同时处理。(注:当然计算机也是可以同时对数据进行处理的,不过同时处理数据的能力有限,了解即可)
然后,我们大概就明白了,为何需要变量?就是因为有些数据需要等待一些时间去让计算机处理,在处理之前,需要先存储起来防止数据丢失,这大概跟人类做运算时候要写在纸上差不多,省的忘了原来的数据,如果忘了那就惨了。
那为啥需要把数据放在一个个变量里进行处理啊?我数据直接放那一团不就行了嘛,这有点类似于我们吃饭,我们一般都是用碗吃饭,而不是直接用锅,原因在于效率高,计算机也是一样,在处理数据的时候,先用变量把在“一锅里的”数据分到一个个小碗里,然后就“吃”的快了。而且之前讲过,我们做饭的地方跟我们吃饭的地方离得距离是比较远的,类似于硬盘中的程序跟cpu处理是比较远的,要想提高效率,就是借助变量变成“小碗”送到内存当中,这样就跟cpu离得近了。其实我感觉变量就是起到了一个方便读取数据的作用。

变量定义与声明的本质

根据上面知识我们明白,程序运行,就是把程序加载到内存当中去,程序计算,需要借助变量提高效率。
那么变量的定义的本质是:在内存当中开辟一块空间,用来保存数据。
变量声明的本质就是:告知编译器。

两者的区别在于,声明你可以声明多次,定义只能定义一次哈。
这个区别说明B站的蛋哥有一个比较有意思的比喻,大概是这样的,变量的定义类似于你跟你女朋友表白,只能表白一次吧?哈哈。然后变量的声明的话就是你告诉你周围的人,那个女孩是我女朋友哈,你们不要有非分之想了哈。这里想说声明可以声明无数次。(这里只是做一个比喻说明一下哈,无任何不良诱导)

3.auto关键字(宽容的关键字,可以省略)

这里,我就需要说明一下《深度解剖C语言》这本书的错误之处了,在这本书当中,本书作者是这样描述的:
在这里插入图片描述
在这里所有变量是不正确的哈,比较准确的说法是局部变量

局部变量和全局变量?

在代码块内定义的变量称为局部变量,在代码块之外定义的变量称之为全局变量。
在这里插入图片描述
两者的差别:
存储区域不同:全局变量的存储是存储在全局数据当中的,局部变量是存储在栈空间当中的。
使用优先级不同:如果全局变量跟局部变量定义的标识符名称一样的话,且两者都可以使用的情况下,基本类似于就近原则,谁近就用谁,一般来说局部变量的优先级比较高一些。
在这里插入图片描述

作用域与生命周期?

这其实是一个与变量相联系的两个概念。这里简单说一下:
所谓作用域:指的是某一个变量的作用范围,简单点来说就是变量从什么时候开始有效到什么时候失效的这个代码区间。举个例子来说,局部变量只能在所定义的代码块中使用,那么这个局部变量的作用域就仅限这个代码块,但是一个全局变量,一般就是从开始定义到代码最后,作用域基本就是全局代码(与全局代码定义的地方有关)。
所谓生命周期来说:也是针对于变量来说的,指的是一个变量在内存开辟到变量在内存中释放的这么一个过程范围。举个例子来说,一般全局变量的生命周期是程序开始运行到程序结束。局部变量的声明周期就是从程序运行到该局部变量定义的那个代码块的开始到该代码块运行结束。
需要注意的话,作用域与生命周期不是一个概念哈,虽然说大多时候两者基本是一致的,但是两者的概念一个指的是影响范围(有效区域)一个指的是内存储存的时间,还是不一样的。

首先是那个作用域问题,你的变量如果不在作用域内使用,编译器会报错哈。
之后为了说明生命周期这个问题,我特地编了一段代码给大家体会一下哈,我记得学校C语言考试老喜欢考这个,还每次都能够坑一些“涉世未深”的年轻小伙子:

int main()
{int i = 0;for (i = 0; i < 10; i++){int j = 0;printf("这是第%d次打印:\n", i);printf("i = %d ", i);printf("j = %d\n", j);j++;}return 0;
}

看答案之前自己先想一下打印结果是啥,答案如下:
在这里插入图片描述
之所以j一直是0,原因就在于每次出for循环那个大括号原本的j就销毁了,再次循环进入的时候又是一个新定义的j,所以后面的j++,没用哈。

auto关键字介绍

上面为了说明这个关键字干啥的就做了大量的铺垫,其实在原书中是没有上面铺垫内容的,直接说就会显得很突兀,突然就冒出来了个auto…
如何使用:一般在代码块中定义的变量,这里指的是局部变量,默认都是auto修饰的,不过我们一般写的时候都是省略的哈。
==但是我需要强调的是并不是所有的变量都是auto修饰的,auto仅仅是用来修饰局部变量的。原书中的描述是错误的哈。==可能同学你在没有读本篇文章之前压根不知道有auto这个关键字,我感觉大部分情况都没有写他的必要。。。当长长见识把哈哈,基本用不到所以大部分的一些教材没有涉及到这个关键字,但是我觉得C语言标准给他定义出来,总归是有用的,大概是我目前修行不够还不知道咋用而已吧哈哈。
这里B站蛋哥有个提示哈:就是上面讲解是适合于C语言的,C++对于auto的理解是不同的。

4.register关键字(读取效率最快的关键字)

首先说一下哈,register关键字比较冷门,可能在读本文章的你又没听说过哈。
我们先来铺垫一些概念,就是硬件存储概念:
在这里插入图片描述
看了这幅图,有些聪明的小伙伴可能就会明白,我买的笔记本电脑为啥硬盘有几百个GB甚至几个TB,而内存却小的只有16GB/32GB了,然后CPU更小了,因为越靠近CPU的这些存储硬件,越贵!同时,我们之前说过,程序没有运行之前都放在硬盘了。访问数据的时候,是逐层往上加载缓存,直到CPU(cpu内部有寄存器)进行计算访问。
之后,数据存储靠的cpu越近,访问自然也越快。
==然后register这个关键字,就是尽量让我们定义的一些变量存储在cpu寄存器内。==注意尽量这俩字哈!!!
需要注意的是:
1.rgister关键字是尽量让你定义的变量放在寄存器当中,能存多少,这个问题依靠于环境,编译器和电脑自身分析判断。
2.一个变量如果放在寄存器当中存储,距离cpu是最近的,那么访问速度也将最快。
3.一个变量如果成功放到了寄存器当中,那么它将不存在地址。C语言中所说的地址,是指的是变量在内存中的存储地址,为啥有地址,是为了方便咱们电脑快速找到并访问数据,现在变量都直接在cpu里存储了,都已经访问到了,也就自然不需要地址了。其实这里我还可以用个比喻来说明,就是你朋友要找你玩,自然得要你家地址吧,这就类似于cpu需要放在内存的变量地址一样,但是如果我直接把你放到你朋友面前,根本就不需要地址。
4.定义变量定义到寄存器的建议:这个变量是高频读取的且较少写入的这种变量。

总结

1.本节内容是简单介绍了一下C语言深度解析这本书和我的系列文章,然后重新认识一下最简单的C程序。
2.介绍了两个关键字及其相关概念:suto、register

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

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

相关文章

BUUCTF Reverse/[2019红帽杯]Snake

BUUCTF Reverse/[2019红帽杯]Snake 下载解压缩后得到可执行文件&#xff0c;而且有一个unity的应用程序&#xff0c;应该是用unity编写的游戏 打开是一个贪吃蛇游戏 用.NET Reflector打开Assembly-CSharp.dll。&#xff08;unity在打包后&#xff0c;会将所有的代码打进一个Ass…

交叉验证的种类和原理(sklearn.model_selection import *)

交叉验证的种类和原理 所有的来自https://scikit-learn.org/stable/modules/cross_validation.html#cross-validation-iterators并掺杂了自己的理解。 文章目录 前言一、基础知识1.1 交叉验证图形表示1.2 交叉验证主要类别 二、部分交叉验证函数&#xff08;每类一个&#xff0…

【C++入门(一)】:详解C++语言的发展及其重要性

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; C入门到进阶 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f324;️什么是C&#x1f324;️C的发展史&#x1f324;️C的重要性☁️语言的广泛度☁️C的领域⭐…

绝地求生:大逃杀,鼠标灵敏度设置教程及枪法练习技巧 鼠标灵敏度怎么设置

《绝地求生大逃杀》鼠标灵敏度怎么设置&#xff1f;作为一款FPS游戏&#xff0c;如何调整鼠标参数是大家急需掌握的&#xff0c;今天闲游盒带来“院长尼克”分享的《绝地求生大逃杀》鼠标灵敏度设置教程及枪法练习技巧&#xff0c;废话不多说&#xff0c;下面我们一起来看吧。 …

C语言——小细节和小知识7

一、逆序字符串 1、递归1 #include <stdio.h> #include <string.h>void ReverseArray(char *str) {char temp *str;//1int len (int)strlen(str);*str *(str len - 1);//2*(str len - 1) \0;//3if(strlen(str 1) > 2)//只要字符串还大于2&#xff0c;就…

【nodejs】Express概念与使用介绍

Express Express是基于Node.js平台&#xff0c;从内置模块http封装出来的第三方模块&#xff0c;可以更方便的开发Web服务器。 中文官网&#xff1a; http://www.expressjs.com.cn/ 一、基本使用 // 导入express const express require(express) // 创建web服务器 const a…

SpringBoot 2 集成Spark 3

前提条件: 运行环境&#xff1a;Hadoop 3.* Spark 3.* ,如果还未安装相关环境&#xff0c;请参考&#xff1a; Spark 初始 CentOS 7 安装Hadoop 3 单机版 SpringBoot 2 集成Spark 3 pom.xml <?xml version"1.0" encoding"UTF-8"?> <pro…

【数据结构和算法】---二叉树(2)--堆的实现和应用

目录 一、堆的概念及结构二、堆结构的实现2.1堆向下调整算法2.2堆向上调整算法2.3删除堆顶元素2.4插入元素2.5其他函数接口 三、堆结构的应用3.1堆排序3.2Top-k问题 四、堆概念及结构相关题目 一、堆的概念及结构 如果有一个数字集合&#xff0c;并把它的所有元素按完全二叉树…

MS6459字符叠加可兼容MAX7456

MS6459 是 OSD 电路,与 MCU 配合使用,可控制不同类型的显示系统。显示点阵为 1218&#xff0c;内置部分数字、英文字符、拉丁字符和中文字符。电路集成有上电复位电路和 VRAM 清零电路用于减轻 MCU 的工作量。 主要特点 输入信号&#xff1a;混合视频信号&#xff1b; 显示字符…

ksuser.dll文件缺失怎么办?软件或游戏无法启动,一键自动修复

很多小伙伴反馈&#xff0c;自己的电脑中了病毒&#xff0c;被杀毒软件清理后&#xff0c;在打开游戏或软件的时候&#xff0c;经常会报错“提示无法找到ksuser.dll文件&#xff0c;建议重新安装软件或游戏”。自己根据提示重装后&#xff0c;还是报错&#xff0c;不知道应该怎…

C++ Qt开发:SqlRelationalTable关联表组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍SqlRelationalTable关联表组件的常用方法及灵…

【C语言】程序练习(四)

大家好&#xff0c;这里是争做图书馆扫地僧的小白。非常感谢各位的支持&#xff0c;也期待着您的关注。 目前博主有着C语言、C、linux以及数据结构的专栏&#xff0c;内容正在逐步的更新。 希望对各位朋友有所帮助同时也期望可以得到各位的支持&#xff0c;有任何问题欢迎私信与…

智能分析网关V4+太阳能供电模式,搭建鱼塘养殖远程视频监控方案

一、行业背景 传统的鱼塘养殖模式由于养殖区域面积大、管理难度高&#xff0c;经常会出现偷钓者、盗窃鱼苗、非法入侵等监管难题&#xff0c;给养殖户带来了不小的经济损失。为了解决这些问题&#xff0c;搭建鱼塘远程监控系统成为了必要之举。通过远程监控系统&#xff0c;管…

别一言不合就重装系统!Windows 无法正常启动先试试这些办法

你是否遇到过在升级或安装 Windows 10 操作系统&#xff0c;Windows 无法正常启动进入桌面&#xff0c;甚至陷入无限循环。造成的原因有很多&#xff0c;比如 Windows 更新&#xff0c;安装了新的软件或者驱动程序&#xff0c;系统文件损坏等等。那遇见 Windows 启动不了怎么办…

【Midjourney】Midjourney根据prompt提示词生成人物图片

目录 &#x1f347;&#x1f347;Midjourney是什么&#xff1f; &#x1f349;&#x1f349;Midjourney怎么用&#xff1f; &#x1f514;&#x1f514;Midjourney提示词格式 Midjourney生成任务示例 例1——航空客舱与乘客 prompt prompt翻译 生成效果 大图展示 细节大…

铂炭催化剂,2026年市场预计将以6.5%左右的复合年增长率增长

铂碳催化剂广泛用于各种工业应用&#xff0c;包括化学、制药和汽车领域。在对清洁能源的需求不断增加和环境问题意识不断提高的推动下&#xff0c;铂碳催化剂市场正在稳步增长。本次分析&#xff0c;我们将从全球市场和中国市场分别考察铂碳催化剂市场的发展趋势。 全球市场分析…

【并发编程篇】线程安全问题_—_ConcurrentHashMap

文章目录 &#x1f354;情景引入&#x1f339;报错了&#xff0c;解决方案 &#x1f354;情景引入 我们运行下面的代码 package org.example.unsafe;import java.util.HashMap; import java.util.Map; import java.util.UUID;public class MapTest {public static void main(…

Kerberos安装教程与命令详解(超详细)

文章目录 前言一、安装准备1. 搭建集群2. 软件包介绍 二、使用shell脚本一键安装1. 复制脚本2. 增加执行权限3. 执行脚本 三、kdb5_util命令1. 简介2. 可用选项和命令的解释3. 常见命令及其说明4. 示例用法 四、kadmin命令1. 简介2. 可用选项和命令的解释3. 常见命令及其说明4.…

芋道视频199 - 工作流 - 关系图 - ruoyi-vue-pro

一 新建表单 数据库&#xff1a;bpm_form。实体类&#xff1a;BpmFormDO.java&#xff1a; 二 流程模型、流程部署、流程定义 1 第1步&#xff1a;创建流程模型 页面操作&#xff1a;实体类&#xff1a;Model.java。数据库&#xff1a;ACT_RE_MODEL 流程模板信息表&#xf…

Python基础进阶:9个易错知识点

你好&#xff0c;我是kelly。 kelly根据自己平时工作&#xff0c;总结9个易错知识点&#xff0c;希望对大家有用。 知识点1&#xff1a;is 和 is比较是两个变量地址是否相同&#xff0c;比较是两个变量的值&#xff08;内容&#xff09;是否相同。 示例&#xff1a; In [92…