粉丝539获赞14.8万

这是啥?这是 int 关键字?那这是啥?这是硬替标识符?那你会有一种理解, int 既可以做关键字,也可以做标识符嘛。但细心的你又发现了,前面的是小写 int, 后面的是大写 int。 所以 说你前面的推论是错误的, 因为在 c 语言的规矩中,标识符不能是关键字,关键字不能做标识符,但如果将关键字其中一个字母改为大写后,可以做标识符。 像这里,系统使用 int 关键字表示整形数据类型,所以用户定义标识符就不能再使用 int, 否则系统提示翻译错误。 而我将 int 的 首字母大写就可以变成标识符。此时聪明的你肯定有许多问题,标识符可不可以为中文?可不可以为符号?可不可以是数字?这些问题慢慢来。首先,标识符不能是中文,只能由字母、下滑线或数字组成。 其次,标识符开头必须由字母或下划线组成。 ok, 关键字与标识符主播先讲到这儿,有啥不懂的评论区或者私信来问,开始讲讲格式字母。小白写 print f 输出语句时可能用不到,但是写 scanf 输入语句的时候肯定要用到。课回上期 sikimf 语句括号内点、百分号地点就是格式字体,并非斯卡福语句都要用到百分号地。并非所有格式字体都只能作用在斯卡福语句上面。所以说,格式字体不止百分号地这一种。至于有哪些格式,请看这张表。 上期我输入的三是有符号的实竟制整数,所以可以用百分号递。接下来讲一下数据类型。数据类型分基本类型、构造类型指真类型、空类型。 本期视频只讲基本类型,而基本类型又分整型、字母型、实型、浮点型和枚举类型。本机只讲前三种。整型用阴梯定义,表示整数,包括正数、负数和零,其取值范围因机器而异,通常在三十二位系统中为这么多。 函数形用叉 r 定义,用于表示单个函数,如函数、数字或符号。实型浮点型用 float 或 double 定义,用于表示带有小数点的数值。接下来讲转一函数,直接看势利,你是不是以为运行后只会输出一行带 n 的 语句运行看一下, 事实证明并非如此,为啥呢?回到代码,我们将 print 语句后括号内容放大,会看见有个反斜杠 n, 这个就是关键,叫转译字母。 转译字母是一种特殊的字母,通常以反斜杠开头,后面跟一个或几个字母。最后展示的是常见的转译字母表。 最后说一下 c 语言,本人是自学,也正在学习过程中,有些地方示范或者操作可能会不规范。欢迎也希望您在评论区或者私信进行指导,提出建议。如果您有不懂,有疑问也欢迎在评论区或私信进行讨论请教。 好了,本期就到这儿,下期想听点什么,欢迎在评论区进行指点建议。最后求求您手中的点赞、收藏、关注,这对我非常重要,谢谢!

小伙伴们大家好,这节课呢,我们继续来说 c 语言相关的知识,接下来呢,我们来说注视,这个注视啊,在生活中的意思和在程序当中基本上是一个概念,比如在生活当中,一般呢是对于一个词语不理解,加以标注,对吧?比如我们看下面这个 见异思迁,这是个成语,我不知道什么意思,怎么办呀?看他的注视呀,注视是见到喜欢的异性就想搬过去和他注。哦,这就是见异思迁呀,那么在程序当中也是如此,来看一下描述,他说注视啊,是对代码的说明 注意,重点来了,编辑器啊,会忽略注视,也就是说注视对实际代码并不会产生影响。 ok, 那 么在 c 语言当中注视呢,有两种表示方法,一种是单行注视,一种是多行注视。 那我们先来看什么是单行注,是将注是放在双斜杠后边,大家看啊,这是斜杠,反斜杠是这样的对不对?然后这个是斜杠,那 从双斜杠到尾部都是属于注是这种注,是呢,只能注是单行,可以放在行首,也可以放在行尾,都是没有问题的。那我们来写个小例子,好吧,打开我们的开发者工具,创建一个新的文件零四, 那,那我们就写一个 t s 吧,点呃, c, 好, 在这里边我们写个主函数, int 们 为 t 上一个零。好,然后呢,我们在这里边还是将我们的头文件给引入进来 我们这里呢,想打印一个文本,比如打印一个 hello world, 好, 正常情况下,咱们这个代码打印是没有问题的,对不对?好,我们运行看一下,打印了一个 hello world, 而现在呢,我们想给这一行代码加一个注视,就是,老师,我不知道 print f 是 干嘛的,我们就可以在它的上面加一个双斜杠,空格,后面加文本信息,可以写中文,可以写英文,都没关系啊,因为这个注视啊, 是不会被变音器所读到的。刚刚我们上面说了一个重点,就是变音器会忽略这个信息,忽略这个注视,也就是说对实际代码是没有影响的,所以写中文写英文,一般没没区别,那我们注视可以写中文。 print f 是 用来打印的 函数。好,此时我们再来运行,大家看,没有任何问题,程序正常运行,对不对?而对我们来说,有了这行注士,我们就知道下面这个函数是干嘛的了,对不对?这就是单行注士,如果你换行了,还想写 hello, 那 就不行了,这就不是注士了。比如写一个,你好, 这就不行了,因为它只是单行注视,你还可以将一段代码给注视掉。比如说我们在 print f 这加一个双斜杠,那这个 print f 就 被注视了,程序呢?就不会被执行了,我们再来运行,你会发现没有任何打印信息,对不对? 除了在这加,你还可以在尾部加,比如在这行代码的尾部,这是一个打印 啊,这也是注视,也不会被程序所读到啊,或者说也不会被呃编辑所读到,对不对?不会对程序产生影响,你看, 但是这个注视的作用我们就知道了啊,他就是对代代,这对对,这段代码用来描述这段代码的,你不知道这段代码是干嘛的,就通过注视来进行描述,对不对? 这是单行注试。好,那除了单行注试呢,我们还有多行注试,将注试放在斜杠、星号、星号、斜杠之间,内部可以分行,因为它是多行,我们演示一下,一般多行注试呢,都是在这个函数的上面,对整个函数体做一个说明。 斜杠斜杠,这是单行注士,在单行注士两个斜杠中间加两个星号,而这个星号中间就代表的是注士,这是一个 多行注士。多行注士的优势是什么?就是它不仅这里面可以写一行,还可以换行,看对不对?好, 是主函数,是闷,好吧,你看他就可以换行,而这一个就被称为是多行注,是运行,同样不会对程序产生影响。看到了吧?好,这是多行注,斜杠 星号星号,斜杠,就开头是斜杠,星号结束是星号,斜杠中间是单行,多行都没关系, 这就是我们的注视,那这个注视啊,大家在使用的时候一定要注意,我们来看一个小例子啊,疯狂的注视,某音乐 app 在 注视的部分加了一个穷逼 vip, 也就是什么,就是你不用去购买啊,通过做任务免费获得的 vip。 然后, 呃,那个程序员在写代码时候就注视了一个穷逼 vip, 你 看这边,这是他的一个具体代码,然后上面用斜杠星号开头星号斜杠结尾写了一个穷逼 vip 活动送的那种,对不对啊,果然穷逼在哪都会被标记,对吧? 啊,这个呢,就是一个注视,这个注视呢,其实当时引起了轩然大波,写这个注视的程序员呢,被辞退了,并且呢还郑重的 道歉了,表示自己以后会啊,很好的去写注,就是会安安分分的去写注注,对吧?注注的目的本身是为了给代码一个解释,对不对?你这么注注的话确实有点。嗯,有点侮辱我了,因为我就属于这个,对吧? 一般呢,就是呃,到处找活动送的那种,不会自己去充值的那种。 ok, 那 这个呢,就是我们呃看到的注视的作用,对吧?那大家了解注视就可以了,注视最好可不要贪杯。好吧, ok, 关于注视呢,大家理解就可以了。感谢各位聆听,咱们下节再见。

hello, 大家好,这一课我们来一起了解一下字母串, 什么是字母串呢?字母串啊,它是由一对双引号扩起来的字母训练,当我们看到这个解释的时候,我们大概就能猜想到它的一个数据长什么样子,就比如说我们可以看到在这的话呢,我列出出来了三个字母串,一个是什么呀? china, 还有一个 c program, 还有一个十二点五, 你会发现这个字母串里边呢,其实可以编辑的内容有很多,比如说英文字母啊,数字啊,符号啊,都是可以使用的,其实说的直接点就是我们单个字母可以去使用的内容,在这里面呢都可以进行编辑, 那么他比这个字母呢的优势在于哪呢?就是我们可以在这里面呢连续写多个, ok, 正因为他可以连续写多个,所以说以后我们再去编辑程序的时候,他的优势就体现出来了, 当我们想要去表示某个比较复杂的内容的时候,我们就不用再去单独的每一个字服用单引号给它编辑好了以后,然后用加号给它拼接起来了,对不对?这就是它的一个具体的一个优势啊。 好,那么问题是这个字母串跟我们之前了解过的字母又有什么区别呢?那在这呢,我们就以常量为说啊,为为基本来说,那么字母常量的话呢,它是由单引号扩起来的, 而咱们字母串的话呢,它是由双引号扩起来的,这就是为了让人家这个 c 元的编辑器来去识别,看看这到底是什么样一个类型,好去进行解析, ok 吧,好,除它以外的话呢,还有就是字母串成这样的话呢,它是由单个字母去组成的,这 在这的话呢,也有特殊情况,比如说转译字母啊,那转译字母的话呢,这属于特殊情况了,咱们就不再去额外去说了,除了转译字母以外,基本上都是由单个字母去组成的, 而字母串呢,它就不一样了,它可以由一个或者是多个字母来进行表示,就比如说我现在的话呢,表示一个英文单词,好,我写个 china 对 不对?那我想要去表示一个价格的时候,我可能什么样?连标点符号、字母、数字啊一块给它放到这里边, 甚至后期我们再去编辑程序的时候,可能会要表示一个文章,我们完全可以把一个文章挨着牌的全都给它理解出来,到时候呢用双引号给它扩起来就可以了,比如说这里面那个内容的长度呢?是不可就是这个预定的啊,或者是不可去预知的, ok 吧?好,那么这是这样一个情况, 好,除他以外的话呢,还有就是一个字母常量的话呢,可以去赋给,赋予给一个字母变量,他指的什么意思呢?比如 比如说我们现在单独写一个字母,写一个 a, 那 么我们能不能单独的用一个标示符来进行表示呢?就比如说我写一个叫做 a, 一 来表示的这个大写字母 a, 可不可以呢?答案是可以的,因为你会发现在 c 语言里面呢,它有专门定义这个字母类型,就比如说我们可以在这去写的时候,我就写一个叫什么呢?等于一个大写的 a, 可不可以啊?可以,没有问题, 但你会发现我们想要去通过这样一个方式定义一个字母差的时候,是没有方法的啊,这不是说没有方法,是目前啊没有直接的一个类型来进行表示的。 那么后边的话呢,咱们会去说什么?说有个叫做差啊差,然后给他一个数组的方式来进行相应的表示, ok 吧?好,那么数组的话呢,我们后边再去说。只说现在目前来说的话呢,是没有直观的一个方式来去定义一个哎,相应的一个字母差的,所以说 字母串常亮,不能直接赋于给一个字母变量, ok 吧?好,那么这是这块好,除它以外的话呢,还有就是它的空间问题,空间问题的话,字母的话呢,它一般情况来说只需要占用一个字节空间就可以了, 而字母而字母串长,这样的话呢,它就什么呀?这个东西就不好预知了,为什么呢?因为你会发现它里边这个内容的话呢,可长可短,对不对?但是的话呢,它也可以进行计算,怎么去计算呢?我们完全可以通过查看它里边这个字母的数量来进行计算, 它是在这里边所有字母的数量的长度,这个和啊也他的长度的基础上加上一就可以了。就比如说我们可以看到在这的话呢,还有一个叫做 c program, 那 么他在去存储的时候怎么去存储呢?他先去分配啊,看,比如说这有一个 c 字母好,那我们就分配一块空间,然后后边有空格好再分配一块空间, 后边每个字母的话呢,单独再去分配一块空间,但他这个空间分配完了以后呢,在后边他再额外的去分配一块空间,但他这个空间的话呢,它会存储什么呢?存储一个杠零, 这个杠铃是干什么用呢?它是为了标识字母串结束的一个标志, ok 吧?所以说的话呢,他只需要想要去计算一个字母串长度的时候,我们只需要什么样数,他这边有多少个字母,然后在这个基础上加一就可以了, ok 吧?好,这就是空间的一个大小的区别啊。 好,那么当我们了解完这个东西以后的话呢,那么接下来的话呢,我们来通过代码再去看一下它具体的一个展示效果啊。 好,那么如果说咱们想看这个效果的话,其实展示的方式也是比较简单,我们直接去进行输出就可以了,我们可以看到在这的话呢,我已经创建好了一个文件叫做字母串点 c, 并且的话呢编写好了一些相应代码,就是引入了标准的输入输出,然后入口地方对不对?好,我们直接什么写一个叫做 print 好, 那么这个 print 的 话里边我们编写内容,咱们之前他去输出的时候的话呢,还记得这里边我们会怎么去写吗?我们会通过双引号进行相应的一个输出,后边的话呢,紧跟一个具体的值,对不对? 那么我们在用双引号的时候为什么要这么去写啊?因为你会发现现在就已经了解了,对吧?这时候他其实说白了就是输出一个字母串,比如说我们这写个什么叫做数据啊,就写汉字了啊,数据 数据啊,数据内容啊,数据内容,然后后边的话呢,一个冒号,冒号后边紧跟什么呢?百分号 s, 那 么当我们再去输出一个字母串的时候,我们是用百分号 s 的 方式进行向下输出的。好,那么问题是这个字母串怎么去进行表示呢?咱们说了 是通过双引号的方式进行表示的,对不对?好,那比如说我写一个字母写一个 a, 好, 那么这时候呢,我们给他进行运行,你会发现在这的话呢,他就给我们去输出了一个 a, 输出一个 a 以后,然后我们再看他这个底下这个控制台也没有出现警告或者是报错的一个情况,对不对?说明这个东西是没有问题的。 那除这样一个写法以外的话呢,那么我们也可以什么再去换其他写法?比如说我现在一个符号啊,那么我再写多个符号,写个叫做 abc, 好 吧,好,那再我们再去运行走起,那这时候的话,你会发现看着吧,这边也是没有问题的啊,那我们在这给它进行换行,不然的话呢,看着是个不舒服啊, 看着不清晰再进行。好,那这时候我们可以看到这边都是没有问题的,对不对?那也就说当我们想要去表示一个字母串长量的时候,我们用双引号就可以了,那么我们能不能用其他的一些符号呢?就比如说我们现在的话呢,给它进行像那个复制,一行下来, 我现在把这个双引号呢,给它换成单引号,那换成单引号的时候,我们想想人家这个 c 元的变器会把它解成解析成什么? 它是不是就应该是一个字母类型啊?对不对?那么我们这时候再去运行的时候,你会发现看到吗?它程序运行过去了,但是的话呢,哎,没给我们进行输出,那么问题是为什么没有给我们进行输出呢? 你会发现在底下呢,他给我们去做出了一些相应的警告,说什么呀?说 print f, 这出现了问题,第几行呢?第六行的第九个字母,这是不是第六行啊?并且的话,咱们编辑器也给出了一些相应的一个输出的,对不对?所以说呢,这是一个错误信息啊。 好,那除他以外的话呢,那比如说我们再去进行输出的时候,再输出的时候,我们如果说不给他相的这个符号可不可以呢?那这时候的话,其实你会发现这直接就给我们爆红了,爆红了以后你再去运行,他根本就什么呀,哎,直接跟我们提示错误了, 所以说呢,这样一个方式也是不可以的, ok 吧?好,那么了解完这个东西以后,那么我们基本上也就清楚了这个字母串应该怎么去使用了,他在去使用的时候一定要去注意了啊,在这边这些就是字母串,就是字母串, 字母串啊,使用什么呀?使用使用双引号啊,扩起来的字母系列, ok 吧?好,那么在输出的时候,输出的时候, 输出的时候通过什么呀?通过百分号 s 来表示啊,来输出啊,表示, ok 吧?好,那么这是这块成,那么这搞定了以后的话呢,关于咱们这个字母串的一个,哎,使用基本上就算是简单的就了解了,好吧,那么后边至于怎么去把它给内给某个变量来进行,相当于一个存储的时候,我们取完数组再去聊它,好吧,好,那么这是这块啊, 好,那么接下来的话呢,我们来看一个练习题,在 c 语言中,以下哪一个选项描述了字母串的正确表示方式? a, 看嘛, hello, hello 的 话呢,它这儿用的是单引号,所以说这个是不合适的。 然后 b 的 话呢,用的是双引号,这个是没有问题的。这儿的话呢,后边符号上啥也没有,所以说这个不行,然后用小括号,这个也是不合适的。因此这道题我们选谁呢?选第二个就可以了啊。

小伙伴们大家好,这节课呢,我们继续来讲 c 语言相关的知识,接下来呢,我们来说转译字母,那转译字母有什么作用呢?我们通过一个小趣闻啊来了解一下。 话说有一个外地人来到了武汉,问当地市民,你们武汉市长是不是叫江大桥啊?那武汉人说,当然不是啊,外地人就很好奇,就发问说,那我过江的时候怎么看到了一副标语,武汉市长江大桥欢迎您呢?你看,中文的博大精深就出来了,对不对? 这句话呢,既可以翻译成武汉市长江大桥,也可以翻译成武汉市长江大桥,是不是啊?那么为了不引起歧义,我们可以在武汉市这个中间加一个空格,或者是将武汉市和长江大桥划分为两行,那如何操作呢?那就需要用到我们所说的转译字母了, 那写个代码给大家演示一下,好吧,来到我们的开发者工具当中,在这里呢,创建一个新的文件零三,可以叫 t m 吧,点 c 可以 吧,在这个里边呢,我们首先写一个主函数, return 一个零,那这里呢,我们就可以去打印了,对吧?在打印前呢,我们需要引入一个头文件, s t, d, i o 点 h, 是 不是?然后在这里呢,我们就可以通过 print f 来实现一个打印了,那我们就打印一个武汉市长江大桥, 好,我们右键运行一下,大家可以看到,在这边呢,就显示了一个文本信息,武汉市长江大桥,为了让他不引起起义呢,我们希望在武汉市和长江大桥中间呢,能加一个空格,怎么加呢?大家看啊,在武汉市这里,我们加一个 反斜杠,反斜杠是哪个按键?是回车上面那个斜杠啊,回车上面那个跟管道符号在一个按键上的那个才是我们的反斜杠,而斜杠呢,是问号按键,也就是 shift 旁边那个按键,那叫斜杠。我们这里要写一个反斜杠,后面加一个 b, 字母 b, 这个时候我们再来运行,你会发现不一样了。哪不一样了?我们的武汉市和长江大桥中间多了一个空格,当然呢,除了加空格,我们还可以加换行,比如我们斜杠 n 就 可以来实现一个换行,那这样两行的打印中间我们加一个换行,可以吧? 清理一下,我们再来输出,你会发现武汉市和长江大桥中间是分开两行的,对不对?武汉市是一行,长江大桥是另一行,那这样的话也不会再引起歧义了。我们这里无论无论看到的是杠 b 还是杠 n, 都被我们称为是转译符。 好,那接下来我们来看一下关于转移字母的基本概念,他说转移字母的核心啊,是一个反斜杠,看到了吗?一个反斜杠,他转移了后续字母的常规意义,其 啊就使其代表特殊功能。例如单独的 n 只是一个字母,那杠 n 就 代表是换行,就是斜杠 n。 啊,反斜杠啊,应该叫反斜杠 n 代表就是换行了,就是我们所看到这样反斜,如果是 b 呢?单独的就是一个字母 b, 比如说我们在长江大桥,长江中间加一个 b, 但它单纯的只是一个 b, 你 看长江 b 大 桥对不对?好,我们加一个,在它 b 的 前面加一个反斜杠的情况下,哎,它就变成了什么,它就变成了空格, 看,他就变成了空格,所以归根结底啊,转移字母的核心就是这个反斜杠,让他具有了特殊的意义。好,那么常用的转移字母还有很多, c 语言定义了一系列标准的转移字母,下面呢,给一些常见的,比如说杠 n 换行杠 t 水平制表符,杠二回车,杠 b 退格,杠 f 换 e 杠。单引号代表是将单引号能输出出来, 杠双引号代表着输出双引号,杠杠代表是输出一个反斜杠,杠零代表是输出一个空字母, 对不对?那比如我们这里可以演示一下,老师,我想打印出来一个双引号的内容,能不能行?就是输出的内容当中,比如说输出一个 hello world, hello world 用一个双引号括起来,能不能做到?可以,这里呢?我们换行一下 word, 在 这里边我们就写一个 hello word, 我 想将这个 hello word 打印出来,而且打印的时候加一个双引号,怎么办呢?如果你直接写双引号,那这明显是违规了,对吧?因为双引号是属于我们 c 语言的那个, 呃,关键符号对不对?那你可以在前面加一个反斜杠,后面也是单独双引号,不行,在双引号前面加一个反斜杠,这个时候我们再来输出,你会发现这个 hello world 就 不单是单纯的 hello world 了,而是加了一个 双引号,对不对?就像我们平时生活一样,比如说老师,我想 print 打印一个 f f, 里边打印一个呵呵, 原本啊呵呵就代表笑的意思对不对?但是现在的呵呵呢,就不代表笑了,一般代表骂人的话对不对啊?所以我们为了让他代表骂人的话,我们可以加一个斜杠啊,反斜杠啊,双引号, 后面呢也加上这个时候我们再来输出,那这个呵呵呢,就变成了有双引号的呵呵了,就不代表笑的意思了,而代表骂人的意思了,是不是?好,我们清空一下,那这样的话就是我们转译自辅的作用。当然呢,我们只演示了一个双引号,单引号也是如此, 呃,斜反斜杠也是如此,杠零空空字母也是如此,还有杠 f, 杠 b, 杠二杠 t, 杠 n, 大家可以自己手动的去操作一下。 ok, 那 么关于转移字母呢,我们就说到这里,感谢各位聆听,咱们下节再见。

想学好 c 语言,又怕知识点又多又杂,无从下手。学单面机用的 c 语言和期末考生的套不太一样,两周的时间学会常用的基础语法完全没问题。刚开始不用死磕课本,找个教程视频,从搭建环境开始,一步步接触变量、循环判断语句字不串函数这些基础语法,只看视频可不行。 你学完一个知识点就整理好思路,自己动手敲一遍代码,接的就是进阶。重点搞懂数组、结构体、直角三个部分,练会使用直角操作地址函数模块化编程和结构体数据打包, 这些都是上手单片机必须要会的内容。我专门整理好了 c 语言学习的全套流程路线图,标注好了所有语法的重点,需要的同学留言六六六。

小伙伴们大家好,这节课呢,我们继续来说 c 语言相关的知识。本节课呢,我们来说 printf 函数,这个 printf 函数在上节课的时候我们已经用到了,通过 printf 呢,打印了一个 hello world, 但是我们并没有详细去讲解这个 print 的 函数,所以这节课呢,咱们单独拎出来来说一说它这个函数的作用啊,其实就是将文本输出到屏幕上,而且为了使用这个函数呢,在上节课的时候,我们还特意去引入了一个头文件,为什么要这么做呢?咱们来看描述, 他说啊,程序需要使用到一些功能,不一定需要自己编辑, c 语言呢,可能已经自带了, 程序员呢,只需要去调用这些自带的功能,就省去了自己编辑代码了。举例来说, printf 这个函数,它就是 c 语言自带的, 只要去调用它就能实现在屏幕上输出内容了。而 c 语言自带的所有这些功能啊,统称为标准库,就如我们刚刚所引入的这个内容,这个内容,它其实就是一个标准库, spdio 的 一个标准库。好,那我们接着往下看,他说因为啊,这些呢,是写入到标准的,到底包含哪些功能,应该怎么去使用,都是规定好的,只有这样才能保证代码的规范和可移植。 那刚刚我们说到了标准库,这个标准库还有一个称呼叫头文件,有的时候我们会叫到标准库,也有的时候我们会叫到头文件,因为口语上我们一般都叫头文件啊啊,这个头文件你没有引入,那个头文件引错了等等这样的说法。 好,我们接着往下看,他说不同的功能定义在不同的文件里面,这些文件统称为头文件。 如果系统自带的某一功能,就一定还有自带描述这个功能的头文件。比如我们之前所用的 print f 这个函数,这个 print f 函数,它的头文件就是系统自带的 s、 t、 d, i、 o 点 h 这个头文件。 头文件的后缀呢,通常是以点 h 结尾,所以一般我们看到点 h 结尾,我们就知道这是个头文件了。如果要使用某功能,就必须预先去加载对应的头文件,加载使用的 是是这个 include 命令,哎,这个时候我们就知道为什么我们这要写一个井号 include 了,因为这个井号 include 就是 什么,就是我们加载头文件的一个命令,对不对啊?这就是为什么我们在使用 print f 之前,必须先加载 spdio 点 h 的 这个头文件的原因了,对不对?好,看到这里我们才知道啊,为了使用这个 print f, 我 们去引入了这个头文件,通过 include 的 这个命令去引入了哪个头文件? s、 c、 d, i、 o 点 h 这个头文件写法时左右还需要加上尖角号,这是系统或者说是 c 语言自带的,对不对? ok, 那么接下来我们再增加一点内容,既然我们说到了 print f, 我 们 print f 还可以做一件事,就是换行操作, print f 不 会在尾部自动去换行,那这样我们在这里再新建一个文件,叫零二下划线 print f 点 c, 我 们可以把之前所写的这个代码复制一下,给它粘贴到我们零二这个文件当中,然后我们运行这个文件。 好,大家可以看到这面打印了一个 hello world, 但是它这个 hello world 的 后缀后尾尾部这里它是不会自动换行的,那我们可以让它进行换行,怎么操作呢?它说 光标就停留在结呃,输出结束的地方,不会自动换行,对吧?为了让光标能换到下一行的开头,可以在文本输出的哦,可以在输出文本的尾部添加一个换行符,叫杠 n 啊,注意这个是正斜杠杠 n, 那 我们可以操作一下,在这个 hello world 后面加一个什么?加一个杠 n, 哎,注意啊,写错了,杠 n 啊,写成中文的了,对吧?加一个杠 n 之后我们再来运行,哎,往下看,你会发现这个跟我们上面打印不一样,上面这个 hello world 他 直接跟着了一个,当然后我们下面这个 hello world, 这就这里, 你看啊看,这里明显还有一行的空隙,后面才是这个档,说明什么?说明换行了,你看光标是可以点到 helloworld 的 下一行的, 这就是我们的换行操作。当然这个换行操作它不仅仅可以在尾部换行,还可以在文本的内部进行换行,所以他说如果文本内部有需要换行,也可以插入这个换行符来进行实现。比如我们希望 helloworld 中间能进行换行操作,那我们就可以这样来操作。 在 helloworld 当中,在这里我们不加空格了,把空格删掉,跟一个斜杠 n, 这个就是在 helloworld 中间实现了一个换行。我们再来运行,大家看一眼, 看最新的这个打印信息,它是将 helloworld 换成两行来进行展示,这就是在文本中间来实现换行的操作, 当然呢,我们不仅可以实现换行的操作,我们还可以实现这个占位符的操作。什么是占位符呢?咱们来看描述,它说 print f 可以 在输出文本中指定占位符,所谓的占位符啊,就是这个位置可以用其他的 值来进行替代,比如我们希望输出一个 three are, 呃, three are there are three apples, 对 吧?就是这有三个苹果,这个三啊,可能是三,也可能是四,也可能是五,那这个 它是一个可变的数字,那这个可变的数字呢,就可以用占位符来进行操作,那怎么操作呢?我们给大家演示一下。好吧,这样我们在这里呢再来多一个 print f 的 输出。 print f 所输出的内容呢?我们这里呢可以复制一下啊,大家可以看到 there are three apples, 对 吧?然后我们后面要注意记得加分号结尾, 否则就会报错,我们将这里的内容呢清空一下,再来进行输出,这个时候我们就会输出一个,大家看啊,这有一个 there are three apples, 对 吧?但我们刚刚说了,这个三呢, 它可能是三,也可能是四,也可能是五,那你不能老去这里去改动三四五,所以这个三啊,我们可以用一个占位符去进行替换。怎么替换呢?用百分号 i 来代表这个占位符,所以这里边我们可以写成这个三,给删掉,写成一个百分号, 然后跟一个 a 就 可以了,然后在我们这里加一个逗号,注意英文中下的逗号,然后再传入一个数值,比如我们传入一个四, 看到了吧,这个时候我们再来运行,你会发现这个三将被四的代表看, there are a, 呃,这就变成三,就这就变成了四,比如说这我们还可以换成原来的三,再来运行,它就会变成原来的三,看这里 是不是变成原来的三了呀?没有任何问题。而这个百分号 r i 就 被我们称为是占位符,所以你看这里边有一段描述, 他说这一段的文本输出中的百分号 i 就是 占位符,表示这个位置要用其他的值来进行替换,也就是我们逗号后面的这个值来进行替换。占位符的第一个字母一律为百分号,第二个字母表示占位符的类型。 老师,什么是类型啊?还不知道呢,当然我们现在没有学类型啊,我们简单的给大家举个例子吧,比如说拿数学来说, 在数学中数字是有类型的,比如说有这个整数小数,对吧?分数啊,还有自然数啊,等等吧,有各种类型去区分。那在我们程序当中,他的这个内容啊, 也是有类型的啊,比如说有数字类型,有文本类型等等。而这个 i 呢,其实代表的是 int, 哎,大家应该还记得 int 吧,代表什么?整数?这个 i 代表的就是整数,所以大家可以看到百分二 i 代表这里需要入,呃,需要代入的值必须是一个整数 啊,除了整数还有没有其他的?有啊,比如还有字母串,字母串叫 string, 用 s 符号来进行代表,用 s 符号来进行代表。所以大家可以看到输出文本中可以有多个单位符,我们在这个多个单位符当中就可以增加一个百分号 s, 那 这样我们来写一下,好吧,在这里我们增加一个 print f, 然后, 呃,在这里我们加一个双引号,在这个时候我们可以把这个文本给复制过来,扔在这里,这里的换行咱们就不要了啊, 加一个分号结尾,大家可以看到,在这个里边我们增加了两个占位符,通过颜色大家也可以区分出来,一个百分号 s, 一个百分号 a, 这个百分号 s 代表的 s 就是 字母串 啊,百分号 a 代表的就是数字,所以在这后面我们要传入两个参数,呃,第一个是字母串,比如说 an, 这是字母串,后面这个是数值,比如说传一个十,可以吧?这个时候我们再来运行,你会发现我们所输出这个文本当中啊, 他的这个百分号 s 这个部分呢?就,哎,这里我们把这两个给注视啊,这样吧,我们加个换行在这后面啊,要不然他就看不出来了,对吧?好,我们再来运行啊, 好,再看打印,大家可以看到这里的原本的那个百分号 s 被 i 所取代了,对不对?然后说了什么?什么?现在是十点钟,对吧?好,大家看这个十就被百分号 i 所代替了,对不对? 好,这个就是我们的占位符,除了占位符呢,在输出的格式上我们也可以做一些文章, 他说不是 f 可以 定制占位符的输出格式,比如说可以限定宽度,还可以限定小数点的位数,因为我们可以输出小数吗?小数呢?你还可以输出有多少位的小数,就是给他控制一下,好,我们一个个来看啊。 先来看这个限定宽度,百分号五 d 表示这个占位符的宽度至少为五位,如果不满足五位 对应的值,后面会以空格来进行添加,我们演示一下吧。好吧,这里边我们为了大家能看到整行的内容呢,我们还是让它换行一下,在这里我们再来一个 print f, 在这个双引号当中我们来写一个百分号五 d, 看到了吗?来一个百分号五 d。 好, 这里,呃,百分号五 d 呢?就代表这个五啊,就代表至少有五位的内容,比如说我们这样 写一个什么呢?写一个就写一个一二三吧,可以吧?好,然后我们把下面清空一下啊,再来重新运行,大家来看一下最后一个输出。 呃,我们这样啊,把上面这个输出呢,我们可以先删掉,一会我们再给他还原啊,这样的话就不打扰大家这个看信息了,对不对?好,我们再来输出,大家可以看到这里边输出了一个一二三没问题,但你会发现这个一二三的前面还有两个空格的位置, 你看这里有两个小点,看到了吗?是能能能看出来吧。好,这里边我们来这么来看啊。 好,大家看这里边在一二三前面两是不是有两个小点啊?一个点,两个点,每个点代表一个空格,所以这代表两个空格。 为什么呢?会有两个空格呢?因为我们在这里边是不是写了一个百分之五 d 代表什么?至少要有五个位置,刚刚这面的文档也说了,至少占五位,对不对?而现在我们的一二三只有几位,只有三位不足怎么办?在前面用空格来补全两个位置,一共有五个位置的长度。 好,大家看,所以我们来说是这个样子,对不对?好,我们把它还原一下啊,把原本我们删掉的给它拿回来,因为大家可能要做参考,对不对?好,除了限定宽度之外,我们还可以限定小数点的位数,比如说我希望小数点后面保留两位,那可以写占位符来进行处理,就是百分号 点二 f f 代表 float, 单精度就代表小数的意思。啊,好,这里我们写一下,这里呢,我们还是加一个杠 n 来进行换行,然后在这里边我们 print f 来写一个。什么写法?是什么写法?是百分号点二 f, 比如说我们就拿这个来说啊,把这个文本咱们粘贴过来, numbers is 这个数字是百分号点二 f, 后面我们加个逗号 多少?后面比如写个零点五,我问大家,这个零点五是小数点后几位只有一位,对不对?而我们这边百分点二 f, 他 明显二代表小数点后面的两位,那他会怎样?他会自动在零点五后面再补一位,咱们运行,大家看一眼啊。 好,我们看最后这个文本内容啊。看这里,你看小数点后面是零点五零,因为不满足两位,我们就用零来进行补位,如果是满足呢?比如说零点五一二,那他会把最后那个二给干掉,大家看 变成了什么?变成了 number, 零点五一,对不对?把后面那个二那个位置给干掉,就是强行限制小数点后面只有两位数,这样的需求在我们程序当中是比较常见的。好, 那你可以看到我们的 print 还是可以做很多事的,就我们的 print f 这个打印的函数还是可以做很多事的,不仅可以打印文本,还可以换行,对吧?还可以限定宽度,还可以限定小数点的位数等等。 啊,这个就是我们 print f 函数的一些常用内容了,后续呢,我们还可能会用到更多关于 print f 函数的操作。那再遇到新的,我们再给大家讲解。好吧,感谢各位聆听,咱们下节再见。

手搓三子棋,大一新生寒假花费两个小时追随就是十分三子棋的一些代码,代码也是非常的长,追随就是在比赛上面边学边操作,在学习代码的过程中也是学到了非常多的一些知识,我觉得学好 c 语言的话,就是要自己手动操作, 一定要去写代码。这三十七小游戏还是比较简陋的,大一的话就开始游戏,之后呢玩家就输入坐标,然后和电脑一下一起,电脑是随机输入坐标的,后面我对他们进行了一些改良吧,就是变成了玩家一和玩家二,然后呢两个人就是输入坐标就可以一起玩,后面我还会分享一些我写的一些代码,纯分享视频,下个视频见。

本视频耗时五个月,共计三十小时,三十八分钟,零基础自学 c 语言从入门到就业,全套教学视频包括开发环境搭建、语法讲解、算法与数据结构等,共三百六十八集。 此视频内容敏感,很可能被下架,建议先收藏再观看。我这里整理了两百多节 c 语言学习教程和学习路线,可供大家学习,需要的三个七抱走。 嗯,好, ok, 那 么我们接着上个视频呢,来讲一下啊,同学们,就是关于这个随机数,对吧?如果说生成的话,他要生存在某一个区间呢?我们应该怎么做,对吧?我们现在回顾一下,我们上个视频所讲的是这个什么呢? 就是我们要改,改变这个什么种子对不对就能生成什么呢?我们的什么叫真正的随机数对不对?嗯,只要种子发生改变,对吧?那么随机数呢,就会发生改变,是不是因为我们的随机数呢?是经过一系列的一个公式呢, 去计算出来的,对吧?那么我们总之要发生改变的话呢,需要干嘛呢?需要用到一个函数,叫做 type 函数,对不对?包括它的一些啊,参数啊,对吧?返回这类型啊,相信大家都应该清楚了,对吧?那么接下来呢,我们还要解决一个问题,什么问题呢?就是说我们上个视频讲了,对吧?我们生成这个随机数, 他这个随机数呢,要么就金额,要么就啊,要么就这个区间很大啊,要么就什么,要么就很小,对吧?那如果说我们想要这个随机数生存在一定的范围呢,对不对?假如说我就是要啊,对吧?生成这个随机数是什么? 是这个对吧?假如说啊,一到是吧啊?五十对吧?或者说 啊,一百到两百对不对?或者说再随机点啊,随便给三十二到什么啊?九十八对不对?如果说我要生成这几个区间那个随机数,那我们应该怎么办呢?对吧?所以这里呢教大家一个公式,就是说啊,生成什么 对吧?生成这个啊,对吧?啊?区间随机数的一个公式好不好?我们在哪里呢? 在上面,对吧?这里教主给大家看一下啊,看到没有?就是用你 rand 吗?就是魔以一个公式,什么公式呢?你这个区间看到没有?就是说一到五十吗?对吧?就是一呢,就是你可以理解为什么是头部 最最开始的那个数据,懂不懂?五十呢?就是最尾部最啊后面的那个数据,明白吧?嗯,是不是头跟尾这一个区间?那么我们要生成这样一个公式就意味着什么问题呢?你得先用这个 rand 这个函数去魔以什么 尾部加一,再减去头,然后呢啊,最终算出来的这个结果呢?再加上头,懂了没有?什么意思呢?哎,大家看啊,就是说假如说我们生成一到五十好,那么我这个随机数怎么随啊?首先 seed, 大家看啊,随机数对吧?然后 time 对不对?给个那好的设计的种子是不是?然后 round 什么意思呢?大家看啊,首先我去模拟,我们根据这个公式来啊,去模拟多少?呃,我们把公式拿下来吧,对吧?那么大家看一下这个公式啊,我们把它拿下来,好不好 啊?放到这里来,对吧?就是首先我的尾部是多少呢?是这个五十,对吧?那五十加一多少?是不是五十一啊?是五十一吗?五十一再减去我们的头,头是多少?头?是一, 是不是一,那么就是五十一减一,对吧?是多少?五十一减一是不是五十啊?然后对吧?前面会生成一个随机数去模拟五十,对吧?没错吧?那么大家想一下,我一个随机数 无,无论他是多少,只要当时他只要磨去五十,那么得到的这个数,对吧?最大也就多少呢?最大是不是啊?啊?不是四十九啊, 对不对?模式求余吗?懂了吧?我不管前面你上那个随机数多少,你一万,两万,三万、四万都没关系,对吧?无论是多少,我磨上这个什么呢?啊?对吧?五十,那得到的这个结果始终是多少啊?那,那是不是始终是这个, 对吧?啊?四十九,对不对?是四十九吧,那么也就是说零到四十九吧,无论前面你是零零摩,也不管说多少,那数据就是零,对不对?所以说他得到的结果呢?不管前面多少,是不是就是零到四十九,再加上这个投,投多少?投是一,那么大家想一下,最高是不是一到五十啊? 对不对?加上一嘛,我就最小的时候是零,零加一是不是一,最大的是四十五,是不是啊?四十九啊?四十九加一是不是五十?所以说我得的这个区间是不是就是一到五十,这个能理解吗?你又或者说我们三十二到九十八, 好不好? ok, 那 么你算尾部是多少?尾部是九十八,那九十八加一是不是九十九啊?跟着老师来啊,九十九,对吧?九十九,九十九减去投,投多少投是三十二?好,九十九减去三十二多少 啊?就是九十九减六十,呃,七,对吧?是不是六十七啊? 没错吧?是不是六十七?那么也就是说我是润前面这个水底,前面这个函数我会通过一系列的计算得了一个数据,我磨上六十七,对不对?求余吗?那么他得到的结果是不是多少?零到六十六啊? 是不是零到六十六?好,是零到,对吧?六十六,那么再加上这个头就多少?三十二,对吧?是不是加三十二?那么加上三十二的话呢?也就是说我这个零加三十二就是三十二,对吧?六十二,六十六加三十二是不是九十 九十八?哎,没错吧,是不是三十二到九十八呀?所以说这就是我们的一个公式,明白吗?不管你想要生成一个什么样的区间,对,他肯定是一个区间吗?对不对?那么你就用什么呢? read 这个函数去模拟什么呢?这个尾部加一是不是?然后呢?再减去头 看到没有?然后最终呢?是不是最小的加上这个头,最大的加这个头不就这个区间吗?是不是?来我们给测试一下啊? 我们可以来测试一下,假如说我们现在有一个数组,对吧? int 艾瑞好不好?然后呢?给他赋个值,一十二,三十三, 对吧?然后啊,或者说我们不用数组也可以吧。呃,我们去怎么样呢?嗯, 我们去手动输入吧,好不好?我们手动输入了 int i, 然后呢,这个数组先不给它赋值好不好?先不给它赋值,我们先给它粗俗化一个多少?一个零吧。 好吧,然后呢,通过我们的这个负循环来进行输入, int i 等于零, i 小 于我们的,假如说就五个数据, 好吧,或者说我们不用宿主存储吧?不用宿主存储啊,直接就是说,呃, int 一个 i e s 吧,然后呢? 对吧?我们就一个一个来吧,就不就不,就是说我们不不不,干嘛呢?不生成啊,很多个随机数是不是?然后放到数组当中,我们就生成一个来测试一下好不好去模拟这个假如说就这个吧,好吧,就是刚刚多少啊?九十八对吧?加一就是九十九,九十九 啊,九十九十九减三十二就是六十七对吧?就是磨上六十七,然后再加上多少呢?加上头三十二, 好,那我们来看一下生成的这个随机数 ctrl f 对 吧?去输出看一下啊,这个 i s。 好, 来,我们现在运行,我们只是这样的话要多运行几次啊,不然的话我们输入组的话呢?可以可以,怎么样?可以,那个前面先注视掉好不好? 用输入组的话呢?可以一次性运行多个数据出来对吧?好,打开是吧?是不是八十一?八十一是不是在三十二到九十八七圈,没错吧?好,在运行 对吧?三十七看到没有?三十七是不是在三十二到九十八之间,对吧?我们就多试运行几次嘛,是不是,哎?五十七对吧?是不是在三十二到九十八之间是吧?嗯,或者说我们不用数组,直接通过负循环去也可以。 int i 对 吧?等于零,大家看啊, i 小 于五,然后呢? i 加加 是吧?就是说他随机生成五次,每次的话呢?我都打印一下。好,那但是他这个允许允许时间呢?可能是同一时间啊,好,也不是同一时间,对吧?因为他翻译呢,这个时间呢不一样好不好?那么大家看到没有,对吧? 我们这里的话呢,就不需要什么呢?就不需要这个数组对不对?来进行存储了,看到没有?是不是?七十二,六十三,五十五,十六,六十,是不是都在三十二到九十八期间啊?对不对?所以大家呢,我们要生成一个区间的随机数,你就记住这个公式,明白吗?尾部加一,扩起来,减去头,然后呢生成的这个数据再加上头就可以, 懂了没有?这就是我们对吧?随机数的一个几个知识点,首先第一个对吧?啊?种子是不是?然后第二个呢?是不是就是我们的这个? 呃,什么也算的随机数对不对?用时间呢?作为种子对吧?就能干嘛呢啊?不会每一次一运行他生成的数呢?是一样的,对不对?好,那我们要生成一个区间的随机数怎么办呢?记住这个公式对吧?就可以了,好不好?

what's up guys? welcome to my channel? 我是 学不会就爆炸!本期视频主要来界定一下硬件编程的第一性。我在刚开始学习单面积的时候,界定了这个单面积的第一性,也是时钟那块每秒震动八百万次的石头总线,就是真实存在的铜丝导线寄存器,也就是晶体管 那个只有零一两种状态的开关。这三者构成了我单面积的第一性,来帮我解释所有的名词,做到直觉和逻辑上的顺畅。那么当我看完硬件之后,我准备打开 q 去写代码的时候,我蒙了, 因为我不知道这些代码是从哪里来的,难道真的要我去背吗?我要背那些代码吗?那总不可能是凭空产生的。所以带着这个疑问,我决定我要界定一下我硬件编程的第一性。 我的代码不可能是凭空产生的,他一定是跟我的单片机芯片一样有第一性的,由这些第一性来组成,所以这是我大概的一个分类的思维导图。 首先我是这样界定的,硬件编程的第一性就是用代码去控制硬件电流,那么在最后我会扩展一下这个从代码到芯片电流的一个过程。福山晶体管,你为什么断电之后,你这晶体管里还要存着零一?主要的第一性分为三大类,基础硬件配置。 你如果要用一个 led, 要写个代码来配置它。你如果要用一个 gpl, 要写个代码来配置它,这是最基本的硬件配置。 然后是逻辑,而主函数、逻辑和中断,我在这里把它们两个称为这个蒙泰奇效果,就像电影里的那个蒙泰奇手法一样, 我们主函数就是一个死循环,它是我们电影的主线,而中断就是插曲,通过不断的快速切换镜头来达到一个效果,这是基本逻辑。 还有算法,我把算法界定为改善误差和完善硬件功能的一个作用,比如说我们的卡尔曼滤波 pid 算法。那具体这两个算法我会在之后的视频来讲解。本期视频的重点就是这个硬件配置过程,为什么这部分是重点呢? 这部分决定了你写的代码是从哪来的,在这个过程中,我会仔细的去讲解我们的代码是从哪里来的。通俗的来讲,我们的 st 公司已经把芯片手册给你写的非常详细,写成代码版存放这个图片里,我们来看一下里面具体有什么。好吧,我们废话不多说,我们直接开始。 好,那我们现在来开始看硬件编程配置这部分。你所有的硬件代码,硬件使用,硬件特性都来源于芯片手册,就像你的硬件不是凭空产生的,你的代码也不是凭空产生的,也不是背出来的。仔细想想,难道第一个写代码,第一个用这个芯片的人,他也背了一堆代码才开始写吗? 那么我们代码来源于哪里?芯片手册里没写代码,那是因为 st 公司专门把你的芯片手册翻译成代码,放在了头文件里,这就是头文件的作用。这四个头文件就是 st 公司专门为 stm 三二来写的头文件。那么我接下来带大家看看里面到底有什么东西。 首先我们来看这个 stm 三二 f 一 零三 x 一 点 h 头文件,你也可以打开你的 q, 点开这个文件,我们来一起看, 每个人的这个文件应该是一样的,往下翻,找到这个部分,我是按照逻辑顺序来分部分的,首先第一部分我称作内存映射的代码版,它的一个格式就是 define, 一个名字是后面的这个地址,那么我们可以看到一个清晰的区别,后面两部分都是一个英文名字加上一段地址, 而第一张图里是直接一个名字和一个地址,那这部分图片里对应的我们芯片手册里是哪部分呢?实际上就是这个总线架构,你可以看到这有 fsmc、 flash sram, 那 么这张 代码就是在规定他们的起始位置,他们的起始地址多少,他们从哪个晶体管开始,从上面的这部分,比如说 fsmc 是 通过一个总线矩阵连接到 hb 总线,然后又分配到 app 二总线, app 一 总线, 那么这个在我们的代码里对应的这个部分,我们可以看到 app 对 应的前面的哪个总线的地址, app 二对应的前面哪个总线地址,再加一些地址, h b 总线再加一些地址,最后顺着这个 a p p 二, a p p 一 到达我们的外设区,就比如说 j p i o 定时器 adc, 那 么对应的就是我们。第三张图里,我们可以看到 j p i o base 是 a p p 二总线的地址,加上一个什么什么地址,就变成它的地址。就像我在第一个视频第一性界定里说的,先找到水库在哪,水库连接到物业的水闸, 物业的水闸又连接到每栋大楼底下,这就是这个图像的第一部分,那到现在你可能还不知道怎么用,我们来现在接看第二部分。第二部分实际上是一大堆结构体,结构体的每个成员是 int 类型, 那么就是占四个字节,每个字节是八个比特,那么我们比如说一行这个成员就占三十二比特,那么这部分东西是干什么用的?你比如说 crl, cr h, id, r o, d r, 那 么当你打开信片手册,你会发现它们对应的 就是你芯片手册里按顺序写的寄存器。 c r l c r h i d r o, d r b s r r, 连顺序都没有改变。为什么?因为他们的物理结构, 他们每个人所占用的晶体管在物理结构上就是按顺序排序的,所以即便是你搬到了代码里,他还是按顺序排序的,他们就是这一片连着排的晶体管,每个人有三十二个晶体管,三十二比特,你比如说打开这个 c r l, 它不对应的也是三十二比特吗? 再看它的地址,零 x 零零,再看 crh, 零 x 零四,每个人占四字节就是按顺序来排序的,所以这部分也是直接按照芯片手册照搬上去的。前面的下划线 i o 是 什么意思?就是 volatile 的 意思,就是如果我们不加这个编辑看到我们写了某一行代码,但是没有用到这行代码, 可能就把这行代码删了。但是我们加这个 virtual 就 会强制它访问内存总线,无论你用不用,你都得去我这个硬件看一下。那么我们接下来看第三部分。我们在第一部分用 define 给每个地址都改了个名字,比如我在这里整理一下 dplb base 存的就是 appr, 这个 base 加上一个数, appr 这个 base 里面又存的是前面那个 base 加上一个数,那么前面这个 pair of base 里面又存的是这个零 x 四零幺幺的数,那我们把它们都替换一下,把这个四零幺带进去,最后就算出来零 x 四零零一零 c 零零,它对应的我们心面手册里 实际上就是这个数。第三部分是用来干什么呢?是用来把这个地址连接到我们刚刚的结构体上,这个结构在 c 语言里被称作强制类型转换, 通俗的来说就是让我们刚刚定义的结构体指向后面的这个数字,当做它的地址。那么前面还有个 define, 就是 把后面改完的这个结构体换名叫做 gplb, 那 么再直白点说,就是结构体现在换个名字叫做 gplb, 然后从零 x 零零一零 c 零零开始存储, 每个成员四个,自己一直往下存,因为你打开信片手册也是这样的一排结构体嘛, c l c r h, 点开,每个结构体里面对应的都有偏移地址,实际上就是这一步,就是把地址送给这个每个计算器。前三部分看完了,还是不知道怎么写代码,代码是从哪来的?这个就要涉及到第四部分了, 也是最后一部分,这部分叫做未定义,我们挑一块来讲,因为它每个结构都是一样的,每个都是这样写的格式都是一样的,这是代码只改了个数。那么第一行就是 define, 这个什么 gpl mod 零 pose 后面有个零 u, 这是什么意思呢?就是把这个零 u 改个名字叫做这个 cirl mod 零 pose, 第零位叫做 mod 零号音角,那么第二行是什么意思呢? define gpl 零 mask 后面对应的一段位操作,就把后面这段位操作改成前面这个名字, 这段未套作是什么意思?我可以看到是零 x 三 u l 两个箭头儿,后面是前面定义的这个 pose position 的 缩写,那么这个 position 里面存的就是零,意思就是把前面这个数左移零位,那么零 x 三换到二点值。什么是一一? 那意思就是把一一左移零位,最后一行第三行 def i g b l c r l 没有零,后面是这个 mask, 我 们刚刚定义的 mask, 又把这个 mask 改个名字,那么总结一下就是三次换名,最后达到了一个功能, 就是把一一左移零位。那我们打开芯片手册再通俗的来看一下,刚刚我们定义了一个操作叫 jpl c r l mod 是 干什么呢?把一一左移零位,我们可以发现就是芯片手册里对应的这个 mod 零,这两位被设置成一了,那它会产生一个什么效果?就是在这里 mod 配置成一一 是输出模式,最大速度五十兆赫兹,所以这一步也是把芯片手册抄进去了。那么我们最后来总结一下,那代码到底是从哪来的?你比如说我现在就要把这个 mode 给配置成输出模式,输出速度是五十兆赫兹,那我们代码怎么写?实际上就是你芯片手册里怎么看的, 你这里就怎么写。你先看到 gpl, gpl 的 结构体里有个东西叫做 cll, 你 现在要配置 cll 计算器的 mode 零, 那就是把刚刚那个位操作给抄过来, jpl cirl mod 零实际上就是把刚刚定义的四个部分抄在一起, 那么还可以怎么写?你还可以直接写 jplb 这个结构体里有一个 cirl 成员,给这个 cirl 做右边这个操作,零 x 三左移零位,或者你还可以直接把它这个计算器给配置成零 x 零三。奥库跟标准库是干嘛用的?实际上就是把刚刚我们定义了好几遍的操作再定义一遍, 变成一个后库的定义和一个标准库的定义。就比如说把刚刚那个位操作给又换个名字,换成 jpl indestruct mode, 或者说 jpl indestruct jpl mode, 这就变成后库跟标准库了, 一切都是为了代码的可读性。我们如果直接写零一的话,代码写多了,你可能不知道这是干嘛的,但是你把它换成一个英文名字,你就能直接读懂,对吧? jpl 抽象结构体 mode 就 里面的成员模式, 把它配置成后面那个模式,一切都是为了代码的可读性,那实际上它从哪来的呢?那全都是从芯片手册里直接翻过来的,没有什么凭空产生或者要背的东西。那么这个最主要的头文件我们就讲完了, 然后我们来看这个必备的 start up 文件,你可以发现这个 start up 文件里面全是一堆向量表,你可能不知道是干什么用的,我也不知道干什么用的。我们把点完翻译之后生成那个 hex 文件,输入芯片之后,芯片会直接先执行这个 start up 的 内容, 实际上就是一堆零一,把芯片里的一些必要的电路结构给打开了,打开这些电路结构,我们后面的一零才能正常工作。大概是起到这三个作用,就是打开堆栈,开辟一块空间,然后告诉 cpu 变量都存放在这些晶体管里。还有打开时钟数,把我们的那块每秒钟能震八百万次的石头给翻倍成七千两百万次, 然后跳转到我们的内函数里,开始逐行执行。这 startup 文件里一般一般都是用一些非常底层的语言汇编语言来写的, 我们一般都直接用,但是你如果想写写,也可以去仔细看看它是怎么写的。这是这个 corecm 三点 h 文件,你知道我们的 stcm 三二实际上是由两个公司合体做出来一款芯片,是由 arm 公司和 st 公司共同做出来的,我们用的 cpu 是 arm 公司的,外设是 st 公司的, st 公司给他们的外设写了一个芯片手册,写了图文件,那 arm 公司实际上也要写一部芯片手册,还有图文件。 所以我们在学中断的时候,或者学一些 cpu 功能的时候,我们会去找一个芯片手册,是这个 lm 公司的芯片手册,但是内部结构和我们刚刚跟 st 公司那边的芯片手册内容是一样的,包括头文件里内容也是一样的,还是先定义基地址,然后定义结构体,合并上面两个 改个名字,然后未操作又改个名字,完全一样的,所以我们使用也是完全一样。最后一个就是这个 system 一个文件,它里面实际上装的是时钟文件,在点 h 文件里会调用一个函数叫 system in it, 然后我们找到它点 c 文件里面,实际上就是一些计算器配置,干什么用呢?实际上就是把八兆赫兹丁震给翻倍成七十二兆赫兹,这部分代码在配置所向环多路选择器,因为那些东西实际上也是计算器,也是可以直接配置,为了我们能快速的使用,所以 sc 公司把这部分也写好了,那么这四个头文件我们就讲完了, 实际上你的所有有关硬件的代码都是来源于这四个头文件里的,没有任何凭空产生的代码,你怎么查手册, 你就怎么查他文件,你就怎么写代码,我想这就是硬件编程的一个第一性。然后我们来看看为什么要用点 c 文件和点 h 文件,这实际上涉及到一个代码的规范性,实际上你的代码可以直接全部都写到一个 menu c 里, 但是想想你如果要写几万行代码,你用到不光一个外设,用到轮胎各种外设,那写到一起你翻阅查看修改,那得多麻烦, 所以我们决定把它分模块写,我轮胎写一个,面写一个, led 写一个,全部都分开,最后合并到一起,这样我们又方便,也不影响实际功能。我每次先写了一个井号 in code, 后面跟一个文件名,这部分是在干什么?首先我们在点变异的时候, 你的编辑器会直接把你 include 的 后面这个文件原封不动的搬到你写 include 的 这个文件里面,那么我们现在分模块写了,你比如说我在 main 点 c 里,我想用这个 led 里的函数怎么用,我们会想到调用一下,然后我们就写了这个 include, 那 么点击编辑的时候就会报错, 为什么点击编辑的时候,把 led 的 代码原封不动的在 me 函数里又写了一遍,这时候 led 点 c 里面的函数被定义了一遍,那么当你的 led 点 c 文件编辑完之后,我们就会开始执行翻译这个 led 点 c 文件,那就又把这个 led 点 c 翻译了一遍,总的来看就是 led 点 c 这个文件被跑了两遍,被定义了两遍,那么 led 点 c 里的所有函数都被定义了两遍, 最后你的链接器就不知道该用谁谁的了,是我在内函数里的那个 led 函数呢?还是我的 led 点 c 里的这个 led 函数呢?这实际上是一个语法规则,就在 c 原理,一个变量函数可以声明多次,但是只能定义一次,就无论你怎么声明都没有问题,但是你定义这同一个函数只能定义一次, 所以我们采用点 h 文件来声明函数,我们就把这个 led 点 c 里的函数,咱们都写成一个声明的格式,放到这个点 h 文件里。 那么我们在 mai 函数里想用这个 led 函数的时候,我们就直接声明一下,我们这时候 include 就 不 include led 点 c 了,直接 include led 点 h, 那 么翻译的时候,那编辑器就会把 led 点 h 里面声明的所有函数都搬到 mai 函数里,这时候你在编辑的时候,就不会再把 led 函数给跑一遍,给定义一遍,而是发现了这些函数,留个标记,然后正常翻译,最后一切都翻译完了,连接器再拿着这个函数的编辑,结果就一对一 找到我们刚刚留标记的地方,把这个零一填进去,这是为什么?我们要分点 c 跟点 h 文件,实际上就是为了我们能跨文件来调用 同时代码的规范性和可读性。那么拿我上一个视频写这个 pwm 来让小车轮胎动起来的过程举个例子,解代码大概是一个什么流程?我们先选用引角,然后看总线,我们要确定地址,然后开总线。时钟找到这个你要用哪些计算器?打开界面手册,看关于时钟的计算器, 然后开始配置 jpio, 看这个 jpio 的 计算器,然后又看你是怎么配置这个 prm。 prm 要用到用到哪些计算器,都在芯片手册里都写得非常清楚, 你只要确定你用哪位就可以了。那么把你全部要用到的计算器找到之后,你就可以直接开始配置了。你比如说我拿这个定时器的部分代码来举个例子,那实际上还是跟我们刚刚投文件里是一样的 type。 二、这个结构器里面有个成员叫 pic 计算器, 我们现在给这个 pic 设成七十一,那这个代码就写完了。哦,后面就是我用 c c r 计算器, c c m r c c e r e j r c r e。 所以 只要你能确定你用的是哪个计算器,你要用到哪个计算器,口头上怎么配置的, 那它代码里也就是这么写的,我 j p l。 你 比如说我用的可能是正电原子的一个头文件,那么除了 st 公司以外的头文件,实际上就是把 st 公司 投文件里面的那些操作又给换了个名字。你比如说我们这儿配着模式,它可能给定义成了这个四 gplc。 这个这个名字里装的是什么?装的就是刚刚我们的位操作,实际上都是万卷不离其宗的, 都是根据那个结构体那些位操作来换名字,换来换去就是换名字。实际上除了那四个必备的投文件,其余比如说各种网课给你投文件,唯一的区别就是名字。那么为了让直觉顺畅,我在这里做一个简单的扩展, 就是来描述一下从代码到新编电流的过程,因为我们写代码实际上还是在控制电流,让电流产生高低。首先第一个问题就是 q 软件是干什么用的?实际上有四个作用。首先第一个作用就是通过编辑器跟汇编器把我们说的这些英文给翻译成机器码, 就是零一。你比如说 a 等于 b 加一,这是我们说的人话,编辑器首先把这段话给翻译成一个汇编语, a、 d、 d 二零二一, 然后井号一,这实际上是一个简编版的人话,然后汇编器就把刚刚的汇编指令给翻译成真正的零一机器码。这个过程实际上就是相当于拿着一本字典,这两本字典里规定了你能写的每一句话,每一句话是什么意思? 两本字典里没规定的,你是写不出来的。那么你写出来之后,这个编辑跟汇编器就拿着这个字典查查你这个 a、 d、 d 对 应的我的零一是什么? 首先是一本巨大的字典,那么第二个作用是什么呢?我们在创建这个记有文件的时候,我们拥有一个 project, 我 们会先选这个芯片的类型,比如我们选这个 s、 d、 m、 三二、 f 一、 零三,然后它就会规划空间,规划地址, 根据你的这个真实芯片的一个内存大小,然后你点击变异以后,它就会根据你这个真实的芯片里面对应的地址, 然后分配你刚刚写的代码,每行代码对应的哪个地址。第三个作用是调试点下 d 之后,你就可以看到芯片里每个计算器的值。第四个作用就是烧录,实际上我的电脑也是一个巨大的芯片,里面也是无数个晶体管组成的。我们的键盘下面,我们按键盘就是在不断地发送电脉冲,你比如说我们按 a, 它会先转换成 ras 码,然后又转换成一堆零一,那么下载的过程就类似于你用一个单片机点亮一个 led 灯,就是让单片机的一个端口产生高电瓶,然后这个电流就顺着流到灯里了。那我们烧录的过程也类似, 我们现在是想让一个单片机的 g p l o 产生高电频,那我们就从主机电脑的一个 usb, 一个 g p l o 产生一个高电频,这个高电频顺着电流流到了我们单片机里,就让那个单片机里的 g、 p l o 产生一个高电频。那么 hack 文件里装了什么?实际上就是装了一大堆被翻译完的零一,我们可以把它切成六个部分,冒号就是起始位, 前两位是数据长度,四位地址偏移。零六数据类型,然后是我们的有效数据,最后是我们的校验核校验为就是把前面的所有数据加起来取反,稍录完之后他会检验一下, 如果稍录的不对,那就说明数据传错了,再重传。那我们现在点了编辑,产生了 hack 文件存在我们的电脑内存里,那 cpu 可以 把我们内存里的数据打包成这个 usb 数据,然后顺着这个 usb 里面实际上有四根线,两根电源,一根 data 正,一根 data 负。 我们单面机里面用的是 jplo, 是 与外部世界连接的通道,叫通用端口,但是电脑与外部世界的通道是 usb, 通过串行总线。 区别就是在于 jplo 有 一根信号线,一根地线,你两根线,那么你信号线比地线电压高,三点三伏,那就是一。你两根线都是零,那就是零,那么缺线就是容易受干扰。 你比如说你地线连接到了那个电压,三点三伏,地线是一伏, 那么两者的差值是二点二伏,不到三点三伏,那就被记成零了,那实际上你的信号线是三点三伏,是一。这就是为什么我们 gpl 一 般只在单面积旁边的几厘米 就不会产生那么大的干扰,所以可以用 gpl。 但是我们的电脑不一样啊,你看你电脑连的 usb 线多长,你可能从你屋连到另外一个屋,这中间电线受到什么干扰我们是不确定的,所以它需要更强的抗干扰能力。那么它的判断标准呢?就是通过它两根 data 线的电压差来决定。 以 data 正上的电压减去 data 负上的电压大于零,那代表一,它的差值小于零,就代表零,实际上是用的我们的磨练知识里面的这个差分。放大电路大概是一个什么意思?这两根线共用一个电源和一根地线。如果在传输过程中受到干扰了, 你比如说我们传输线电压升高了一伏,那么这两根 data 正跟 data 负,他们两个是同时升高一伏的,所以他们的差值会保持不变。像我们刚刚的 dpi, 一 根信号线和一根地线,你地线受影响了, 你另一根线是不受影响,他差不多也是我们前面讲的电机一个 h 桥结构是什么样子?我们可以看到他低正低负都共用的是一个电源和一个 d, 那 么我们想要一,我们就开关,一开关四,这时候低正连接的就是正点,低负连接的就是 d, 所以 他俩差是正的,那么想状态零就开,三和二就反过来了。 那么在这个过程中涉及到一个东西叫做 usb 协议,毕竟你电脑用的是 usb, 但是你单面机用的是 gpio, 它们两个不能是直通的,一个四根线,一个两根线,它们传递的信息方式不一样啊。那么协议是做什么用的?那比如说期末之后,你准备给室友打校抄, 你说按比按两下是 a, 按三下是 b, 而以此类推。约定好之后,你的室友蒙了,说你一直按,我哪知道你什么时候开始,你问的是第几题答案啊?于是你想的等一下,所有室友都准备好了,按完这一下之后, 等一下再按题号,再等一下,再按答案,再等一下再传送一个核对的消息给你室友,问问他们都抄对了没?这就是协议,你跟你室友之间的协议。那么 usb 协议是什么?分为三个包, 六个包,数据包、握手包,其实跟刚才的过程差不多,我拿数据包结构来举个例子,那么你刚刚先按的第一项就是同步域的 usb, 先发一段特殊的按的节奏来告诉你的单片机我要发送了, 咱们同步一下。第二部分叫这个 pid, 刚刚我们同步完了,这部分就是在发题号,告诉你我这是第几题就开始发真正答案, date 要发,数据就存在这里。最后还有一个 crc 十六位教练来检查一下,各位都接受对了没有?最后通过一个 uop, 你 的室友给你打信号说, ok, 我 们写完了撤退吧。那么另牌包跟握手包的结构也都类似于此,里面装的东西具体东西不一样, 但是结构是一样,这就是 usb 协议差分信号顺着这个 usb 线流出去了,流到我们这个 link 里,就我们用的这个下载器,这个 link 里面实际上也是一块 stm 三二芯片, 我们刚刚不是说 usb 信号是通过两根 data 正跟 data 负的电压差来发送零一的,那么在我们这个 st link 里有两根线来接收那个 data 正跟 data 负, 然后通过一个比较器来比较两根线的电压,转换成一和零,存储到我们这个 s t link 芯片里,这个 s t link 再通过 j p l o 把刚刚存储的这个零异状态给发出去,那么通过你的 s t link 再往你的单片级反,这个就涉及到 sw d 协议,那么这次实际上你跟你的舍友就没有坐那么远了,你们不需要再按比来对答案了, 你们只需要抖腿,他就坐在你隔壁,就是同步通讯。首先第一步还是发出请求,你比如说抖八下腿,你舍友给你回三下,说他接受,确认接收,然后你开始传答案,最后再加一位教练位,这时到什么是偶教练,什么是基教练?偶教练就是你发送的数据加上最后一位其中一的总数,比如是偶数个, 那么基向量就是 e 的 总数, b 是 基数格,这就是 s w d 协议。这时候我们的信号成功从 usb 信号转换成单频机能听懂的信号,那么就从 st link 里面这块 st m 三二流到我们要用的那块 st m 三二里,然后接入单频机的端口, 然后存入晶体管。那么你有没有想过为什么我们的零一信号在断电的情况下依旧可以存在我们单频机里,我们直接开机就可以使用断电了,这些零一不消失吗?这个要考虑到我们的普通晶体管是不一样的, 他用的东西是氟杉晶体管,在我们的晶体管上做了一个改善,我们我们从 se link 里流出的信号连接到我们的单面机端口,然后经过一个译码器来翻译这组数据,这组数据里有不同的信息,有各种协议,他需要把这些协议先拆开, 然后分析你这个数据包里地址对应的是哪,这个地址里要存什么,实际上就是打开特定的电路结构,让电流流进去。在这个搜索过程中, 它实际上是一个行列搜索,它是一个巨大的 x y 坐标像,如果你要存一百位数据,一百位比特,你要用到一百个晶体管,如果排成一百的话,我们需要一百万根线才能连接,但是你把它做成 x y 坐标的,你就一千根线就把这些东西都连完了,你就要用通过密码器来把这个数据包里的地址算出来, 算出来他的 x 坐标和 y 坐标,然后你导通这两个直线,就能把我们的具体位置给打开了。那么断电后如何依旧存在呢?这里我简述一下。在我的第一期视频第一性的界定里,讲到了静电管这个原理, 实际上就是通过给一个电压吸这个半导体里的自由电子,通过这个自由电子把两个半导体中间原本封闭的路撑开一条通道,让电流流过去。浮山井这块就是在原有的基础上,在我们的山脊,也就是我们加电压的地方下面加了一层 这个釜山层,两边都是不导电的二氧化硅。这里就用到我们的量子物理中的一个隧道效应,就是说我们的电子他是有玻璃二象性的, 又有粒子性,又有波动性,粒子性决定了他被困在这个绝缘体中间不会过去,但是波动性决定了他能跳动我们的这个自由电子,即便两边是绝缘体,但这个绝缘体足够的薄的话,他就能通过波动性跳过去,这就是一个大概的原理。 那么我们现在还是在这个山脊加一个。那么我们上个视频也说了,我们的 stm 三二一般只能承受三点三伏和五伏,因为它里面的进水管薄而小,但是三点三伏是没法让这个绝缘体变非常薄的。那怎么办? 我们需要更高的电压,实际上这里面有个结构叫做电和泵,还是一个由 rc 组成的电路,利用这个电容的储能特性,就是在它的极板上堆积电赫吧, 因为中间是绝缘体的,过不去,所以只能堆积,然后产生电场把它发射出去。这我在时钟那篇讲过,现在我们把这个三点三伏接入到这样一个电和泵的结构里,把三点三伏的电子就会跟这个电容里积攒的这个电子一同发射出去,做到一个翻倍的作用, 经过好几个这样的电路,就能把我们的三点三伏翻翻倍成二十伏。当我们有二十伏电压的时候,我们就足以把这个绝缘层压的非常薄, 中间我们这个衬底就是下面的这层半导体,里面的自由电子就能被吸上来,通过他们的波动性在那疯狂的震动,然后跳过那个绝缘层到达我们的这个佛山层。到达里面之后,我们把这个二伏断开,就会发现一个神奇的现象,电盒被关在两个绝缘层中间了,因为你把电压去掉了,那个绝缘层的厚度又恢复了,现在 由于电子的粒子性,它是无法通过两边的这个绝缘层的,电盒就被关在里面了,所以你 cpu 在 调用,在查内存的时候,只需要看这个氟碳层有没有电子就可以了, 一般里面有电子代表零,里面没电子代表一。为什么呢?当我们撤去二十伏之后,你再加三点三伏,你会发现一个神奇的现象,就是电场被抵消了, 然后浮山层里刚刚吸进去的电子会产生一个电场,它的方向正好是跟我们加在山体的电压是相反的,两个电场抵消了,所以产生一个零。那么如果没有中间的这个这个电子,我们正常加三点三伏,它这个晶体管还是会和正常的晶体管一样底下导通,然后产生一,这就是一个永久存储的原理。为什么我们断电之后这个零一还在里面? c p u 就是 沿着这个总线读区里面是有没有电子,福田精密管旁边有个零点放大器,根据你这个精密管里这个格子里有没有电流,然后放大完成这个标准的高低电瓶,这个过程实际上就是取码一码和执行的过程,那么到这里我们大概就了解了一个从代码到芯片电流的过程以及协议是什么, 釜山经济馆的存储原理是什么。那么好,本期视频就到这里结束了,我们通过硬件编程的第一性来确定了我们以后写代码一个思路。接下来我会加快我的项目进度,因为过年这阵玩的有点疯了, 我会用几天快速的给我的小车加满外设,在这个过程中去学习,而且我还没有用到的知识,比如说终端 adc 通信, uzi 的 sp, 大 概会用一个星期的时间把这些东西快速的做完,去做点别的。好吧,那么我们本期视频就到这里就结束了,我们下一期再见。 拜拜。

本视频耗时五个月,共计三十小时,三十八分钟零基础自学 c 语言从入门到就业,全套教学视频包括开发环境搭建、语法讲解算法与数据结构等,共三百六十八集。 此视频内容敏感,很可能被下架,建议先收藏再观看。我这里整理了两百多节 c 语言学习教程和学习路线,可供大家学习,需要的三个七抱走。 那么接下来的话呢,就跟大家讲一下我们的这个,呃,有个函数啊,叫随机函数啊,因为有一些我们的系统之外的一些函数呢,包括我们以后,对吧?在写代码的过程当中,包括大家以后搞开发的过程当中,都用的会非常多的一些函数啊,因为这个函数这个东西呢, 对吧?你说后面教主我遇到了,再学一些函数,对吧?那个也没问题啊,就有一些函数呢,是需要 教主呢跟大家讲清楚,不然的话到时候你即使碰到了你也会什么呢?你也会看不懂,没有报税。先跟大家讲一下,我们现在学我们的这个 c 语言呢,这个当中啊我们用的很多的一个函数叫随机函数, 什么叫随机函数呢?就是说你给这么理解对吧?就是说我们有时候假如说我们做一个游戏,对吧?我们要做一个软件,对不对?那么呢我们如果说去假如说我们去抽奖,对吧?那么抽奖啊,他的一个概率呢?对吧?我要让他说让他什么是一个随机概率, 明白吗?游戏里面对不对?要抽什么奖,抽什么什么东西,对吧?我让我要让他这个概率呢,是一个随机的,就是说所有的人去做一件事情,对吧?他都是公平,公平公正的, 明白吗?就需要我们设计一个什么这种随机的一个,对不对?这种运气成分在里面,这这样的一个啊?这样的一个代码,明白吧?所以这个时候我们应该怎么去,对吧?去随机生成这种啊?数字呢?随机生成一个数据呢,对不对啊?这个数据是多少呢?对吧?所以呢,今天就教大家啊,去使用这一个函数好不好? 那么我们的随机函数呢?我们也叫什么呢?叫做叫做这个尾尾随机数啊,生成随机数的函数叫随啊随,叫,你就理解为叫随机函数好不好?但是他生成的这个数据呢?叫什么呢? 叫做尾随机数,并不是说,对吧?哎,我这个生成一个数据,这个数据呢是电脑随便给出来的,对吧?他不是的,我们叫尾随机数,就是说什么叫尾随机数呢?他并不是真真正正计算机啊,你说对吧?给给一个数据, 是不是的啊?你然后去突然冒出来一个数,不是的啊?他是经过一计一系列的一些计算而生成的,就假如说我们两个面对面, 对吧?你随机说一个数,是不是的?那你假如说你说一百,但是这个一百,他并不是说无,对吧?就是说这个无故产生的,是不是啊?他是在你的一个 对不对嘴巴里面或者是脑子当中已经想好了再说出来的吗?是不是啊?他是一样的道理,明白吧?就是说什么意思呢?大家看啊,我们随机生成一个随机数呢?他有一个什么呢?他有一个函数,那有一个函数,我们叫做那个,我想一下叫什么?叫数学当中的一个叫线线同于方程 那个方,那个方程?是啊,你不用去解他,明白吧?那个方程是我在大家学,我大学课程里面呢,你像有一些密码学啊, 对吧?数学了啊,物理学里面呢?呃,有很呃,像这种学科里面啊,有的一些呢,他是会学的这个方程式的,叫做线线同一方程,但是那个方程式呢?你不用不用,不用去理解,因为那个方程式呢,你看不懂明白他的那个啊,符号啊,我跟大家讲都是三个符号, 是这种三个符号你你见都没见过,所以说那个信念同一方程你不用去管好不好,你只需要知道,就是说我们有一个这种方程是能计算一个这样的数据的,就是说它是个什么样的方程,是呢,大家看啊,就是说 int, 那 对吧,然后呢?等于这个,呃,或者说我们假如说, 呃 a 吧乘上啊,这个 number, 对 吧?这个叫 number 一 吧,好不好?随便改一个,这个是 number 零吧,然后加上一个 b, 再模拟什么的一个 c, 明白吧?是这里一个啊, 公式懂不懂?这个就是你给理解为叫线一线啊,同一方程,但是呢,但是呢,不用你去记啊,不要你去了解那个方程式,你只需要知道,对吧?哎,我这里有个数据, a 跟 abc 的 值呢,我们可以去改,明白,可以去改的啊,就说你改多少都行,你假如说我们这个 a 是 什么? a 是 对吧?啊?一百呀,可以吧?啊,然后呢?这个啊, b 是 多少呢? b 是 四十二三啊,对吧?啊? c 是 多少呢啊?五十啊,对吧?都是可以的,看到没有,对不对?那么我经过一系列的操作就会得到那么一的值吗? 这个那么一呢?就是随机数,懂了吧?嗯,是不是?那么我 a 是 不是还需要一个那么零的值呢?所以说我前面再定一个那么零,假如说等于多少?等于啊?一十,对吧?看到没有? 能能能懂这个意思吗?是不是?那么也就是说我的那那么零等于十十乘一百等于多少?等于这个一千一千加四十三等于一零四三,再模拟五十就求余吗?明白没有?然后是不是会得到一个数据呢?就是那么一,这个那么一呢?就是个随机数, 懂了吧?所以说我们得到的这个数据那么一呢?他并不是说真的说是计算机怎么样啊,随机产生的一个数据,而是说我们通过一一系的一个计算而算出来的,明白吧?是不是?然后我又有什么那么二, 对吧?他又等于什么呢?一样的啊?一百乘以这个那么一,明白吧?加上四十三,对吧?然后再抹以我们的五十,看到没有?就是说 我们,对吧?只要有一个出使值,对不对?只要有一个出使值,那么就能计算出什么,就能随机生成的,你这个里面这么理解根据这个公式吗?对吧?看到没有?这这个公式,我们叫线线统一方程,所以说你暂时不用管,就有一个这样的公式,懂了没有?然后呢?可以计算出什么?后面很多很多的随机数,理解没有? 这就是我们的一个随机数的一个原理啊,明白吧?那么在这个过程当中呢,对吧?我们就把这个叫什么?纳姆林叫出使值嘛?它叫做种子, 是不是?我只要有了种子,对不对?我就有了出使值,是不是?那我就能算出来很多的数据,明白没有?嗯?是不是?所以我们把这个过程呢?就是说在我们 c 元当中啊,这个种子我们用一个函数来表示,叫做 rand, 看到没有?就随机生成一个种子,对吧?你给一个随机生成种子啊,但是我们暂时先不管好不好,我们把这个部分呢分装成代码,就用这个函数来表示,因为我们说了函数呢就是分装功能的容器,对不对?我们并不需要说啊,去搞这么多啊,算数不?不需要的, 懂了没有?哎?生成一个随机种子,看到没有?就用这个函数来表示,懂了吧?这一段工程师呢,我们用这个函数来表示,叫 run 的 函数, 看到没有?就是说我们把这个工程师呢是把计算的一个啊,什么过程呢?分装在这个函数里面,我们只要去用就可以了,理解没有,这就是所以。但是呢,大家可以想象一下,我们随机生成的一个,对吧?通过这个函数啊,计算出一个结果,对吧?假如说用一个数据呢去接收 int, 那 么一 就是这个意思了,明白没有?就是说随机生成这样的一个过程,把它分成成了一个函数,是不是就因为得这个数据,再把这个数据呢复制给 number 一, 对不对?看到没有就随机生成,就这个 number 一 叫什么呢?叫随机数,是不是?但是这个随机数呢?我们叫尾随机数,为什么呢?因为它也是什么通过一系列的计算而计算出来的, 明白来,我们通过代码可以演示一下啊,大家看啊,首先呢,我们先要干嘛?先得有种子吧,没有种子你这个纳姆林对不对?是不是没有值啊?你没有值的话,纳姆林是永远都没有值,明白这个意思吗?所以说这个纳姆林呢,首先他得有一个值,理解没有对不对?我们假如说这个是 round 啊啊,我再跟大家讲一下这两个函数呢,如果说你要去用的话,必须先导一个头文件啊,先导一,我们得导一个什么头文件呢?叫做 t s t d l i b, 叫做我们的标准库头文件,就为什么呢?你就因为我们有的函数呢,对吧?它所在的原型呢?它在不同的文件当中,你就比如说我们这个 primitive 函数,它是在什么呢? is tilde 点 h 这个文件里面的,对吧?并不是说我们所有的函数,哎,后面我们学的很多很多的函数,对吧?啊?它并不是说都被分装在什么啊,这个 is tilde 点 h 这样的一个头文件中,这里跟大家讲一下原理啊,就是说就像我们现在我们学的这种函数,对吧?这种函数呢,并不是我们自己写的嘛, 而是说系统自带的吗?对不对?我们后面写很多很多的代码,实现很多的功能,就是调用这种函数呢,这种函数并不需,并不是说我们写个程序啊,做个游戏所有的功能性的函数都需要我们自己写,不需要大部分都是可以干嘛呢?直接用,就是说别人已经分装好了,懂了没有?是不是这样?在什么我们的头文件当中 理解吧,在头文件里面就是说在另外一个文件里面,它被分装好了,我们在原文件里面只是拿过来用而已,理解没有?就是说我们的文件呢?你给这么理解,它分为两种,一种是呢,我们经常用的啊,叫点 h 的, 我们叫头文件,一种是点 c p p 的, 我们叫什么?叫原文件, 这个能够明白吗?我们大部分就是说系统会什么呢?有一些自带的这种函数,而这种函数的原型呢,就被分装在头文件里面, 咳,明白这意思没有?所以为什么说我们在对吧写调用 parent 函数的时候,一定要先导这个头文件呢?就这个原因,因为这个 parent f 这个代码,这个函数,它的原型啊,原型 啊,原型,明白吧?是在这个头文件当中的,你不导这个头文件,你就没法去用这个 parent 函数,理解没有。嗯,那不同的函数呢?它可能在不同的什么呢?这个头文件当中啊,所以这个呢,需要大家去背一下啊,对吧?就像我们今天说的,哎,这个什么是 rand 或者是 rand 函数,它的原型呢?在这个头文件里面, 你要去用这两个函数的话,就必须先导这个头文件,明白这个意思没有,对不对?这个你可以记一下,也可以多去写,然后自然而然就熟悉了,明白吧。嗯,好,是不是?那我们来看一下啊,对吧,现在是乱的, 对吧,看到没有啊?随随机种子嘛,先得有随机种子了,得有促使值了,是不是啊?这个那么零,有值了之后才能计算出什么,谁就说了,对不对?我们假如说这个种子,为什么呢?为一十,好不好? 看到没有?是不是就一时嘛?就是我设计的一个种子,是不是有了种子之后呢?对不对?我就给什么呢?调用我们的这个什么函数?任意函数,看到没有?随机生成函数嘛?明白这个意思吧,对不对?那么他就会得这个结果,得这个结果呢?用什么 number? 零 number 一 去接受一下,理解没有 那么一啊,去接受一下,懂了吧?他就会得到一个结果嘛,对不对?是不是?嗯,我们打打印看一下了, n f 输出那么一对吧,来,现在我们运行,大家看一下,是不是会得到一个数据,得到一个结果, 好变异,通过运行,是吗?大家看到没有,是不是就会得到一个结果?是七十一啊?他就随机生成一个这样的数据,懂了吗?其实他就是把什么呢?我们的一个这种公式分东在这个 run 的 函数里面,是不是我们只要学会用就可以了,懂了吗?你可以把鼠标放在上面看啊,就是说 run 的 这个函数呢? 或者说我们可以,哎,好卡啊,或者说我们可以看到没有,就是说我们想去看,哎,刚刚我们讲的就是说我们的函数,对吧?有的一些系统的函数呢,是吧?我们用就可以了,但是我们想看一下它的原型,怎么看呢?我们可以单机鼠标右键看到没有一个转到定义,你点点一下就可以去看了, 看到没有是吧?那么我们 run 的 这个函数呢?你就会发现他没有参数啊,不需要参数是吧?有一个返回值就是 int 类型的数据,是不是就是说这个函数呢?最终呢会得到一个数据吗?是不是用 int 类型的?用用 int 类型什么变量去接受一下不就可以了吗?懂了吧,是不是这个函数它也是一样的啊?找到第一 看到没有,就是一个无符号的一个整数类型的数据对吧?啊?无符号类型的一个整数类型的数据好不好? 这里还可以转到店去看啊。好,这个暂时没关系。好吧,就见现在的话呢大家呢就暂时这么理解好不好?嗯就是说随机数他也叫尾数数,并不是说啊电脑里面无缘无故产生一个,而是通过一系列的计算 对不对?最终得到的啊,好不好?但是呢要计算就是说你把把这个函数 run 的 函数看成什么呢?计算的一个过程是不是?那么我要计算的话需要一个前提什么呢?我得有个促使值,看见没有就是那么零嘛,对不对?也叫种子,所以说我们得先干嘛呢?通过 random 先得什么产生一个种子然后跟它呢去联系起来, 理解没有?嗯,好不好?这是这一个啊,对吧?那么同样的话我们这是生成一个随机数,那如果说我要生成十个二十个五十个随机数怎么办?是不是通过循环去实现就可以了呀?对吧,大家看啊否循环 int i 等于零对吧?然后 i 小 于十, i 加加 对不对?然后把它放到里面来,是不是?那么我们一运行对不对?它就会得到很多很多个随机数,明白吧?看到没有?是不是得到很多很多个随机数啊? 是不是你这个数据你发现对吧?我们通过这个代码啊得到啊负值,是不是啊?你会发现一个问题,什么问题呢?我这些数据并不是说,对吧?就说对于我们的一般的人来讲,对于我们的计算器来讲,他并不知道这些数据是怎么产生的,对不对? 那就是对于别人来说了,对你同学来讲,是不是他只能看得到,哎,这里很多的数据是通过一系列的代码怎么样随机生成的,懂了吧?但是你要知道它的原理对不对?就是通过一个公式呢去计算出来的,所以说我们叫尾随的数好吗? 嗯, ok, 这就是我们关于随机数的概念,那么同样的话有一些问题,什么问题呢?对吧?大家发现一个问题啊,现在我们随机生成得到的随机数,我再运行的话,它这个数据怎么样,是吧?你先我们先把这个图先截个图啊, 我们先发到这里来,好不好?是吧?大家可以看啊,就是说我现在随机生成的数据是这么多,好,那现在呢?我再重新运行, 对吧?看到没有?你会发现一个问题,他这些数据的结果怎么样?他是一样的,对吧?我那我就想他不一样怎么办呢?是不是?所以这个时候呢,我们就要用到一些其他的一些知识点好不好?又或者说对吧?我这个随机数呢,他产生的数据呢?是什么?是一个没有范围的对不对? 你看嘛,一下子有几万,一下子又几十,一下子又几千,对不对啊?是不是?那我想他在生成什么呢?一定范围内的随机数呢?就一到十里面随机生成一个数, 对吧?一啊,就像我们假如说要做一个软件啊,要做一个抽奖系统,对不对?我要抽到一到十里面的一位数,是不是?我不需要干嘛呢?超过一十,对吧?那这个时候我们应该怎么办?干嘛?应该怎么写?那么这个随机数应该怎么生成,对吧?好,那我们留在呢下一个视频呢来进行讲解。

呃, java 已死,然后什么前端已死,然后呃什么 python 不 用学,太简单了。呃怎么怎么样?就是这种言论很多,应该怎么去选择自己入门的第一第一个编程语言,然后这个的话就是新手入门啊,常常遇到的第一个问题,他可能 不知道这个语言是怎么样的,然后他有一些什么什么样的一个优缺点,然后他就贸然的去选选择了一门语言,然后 就导致啊可能这个就在这上面会浪费,白白浪费掉很多的时间。比如说他是呃要去实验室里边做这种科研的, 然后要读研究生的这种,那他选第一门语言,比如说他选了 java, 那 可能进了实验室之后很多什么数据分析这些活的话,可能需要用 python 去做,那其实就是他在 java 上这段时间其实可能就稍稍有点浪费了。然后 今天的话就希望通过这视频呢,然后给大家讲一下每门语言他是适合干什么?然后他的一个呃优点和缺点是什么?然后比如说你是处在哪个阶段的?是找实习的,还是保研考研的?还是说单纯的对这个有一点兴趣, 然后这这些人群呢?他应该怎么去选择适合自己的这样一门语言? 然后首先的话,我觉得作为一个纯新手纯小白的话,他其实首先纠结的第一个点就是他怕选错。比如说我是马上去找实习,我已经大三下了,然后我还呃,基本上什么都不清楚,不知道,然后我怎么样? 呃,因为因为我马上要经历的就是暑期实习,然后秋招、春招嘛,然后我怎么样可以让自己选哪一门语言,让自己能够很快的拿到一个 offer, 拿到一个结果。 然后呃这个时候如果比如说你选了 c 加加,呃,那么 c 加加我们可能常听到 的一句话就是 c 加加两年入门,就是他的一个学习曲线非常的陡峭,然后如果你想在这上面啊学到一个可以去实习的程度,那可能需要的时间确实比其他语言要久一点,所以这个时候呢,如果选错了,那可能就是事倍功半了,就是你 得到的啊收益可能就受益甚微了。然后下一个的话,就是有一些同学的话,他其实 啊了解过之后,他觉得啊 python 简单,我想学,然后学 java 的 话,又是就业,就业很多,然后我又我又想要这么好的就业,然后 c 加加的话又是做底层的,然后又想要 c 加加, 就是他想要就是很短时间内把所有语言都学会,就是想一口吃成一个胖子,其实这个也是不太现实的,作为一个新手的话,我们 还是要选择自己的一门主语言,然后把这个东西呃做一个精通,然后比如说花三个月,六个月,然后去学一下这门语言,带来的收益一定是要比你,比如说花三个月到六个月,然后把每门语言都粗浅的去看了一下,这个收益其实呃 相对来说就打折扣了吗?然后还有一些人的话就是,呃也不知道该学哪门语言,然后就看网上吗?然后网上其实说什么的也有,然后就说什么呃加把已死,然后什么前端已死,然后 呃什么 python 不 用学,太简单了,怎么怎么样?就是这种言论很多啊,其实有有些呢,其实也非常的片面,就是 大家可能呃如果真是小白,没有一些基础的话,很容易被这些言论去影响到,然后误导大家的一个选择。 然后其实我想说的话,我认为啊,就是真相是,就是每一门语言他设计出来一定是对应着一定的需求的,所以只要他是对应着这个需求设计出来的语言,那他就有一定就不是完美的一定。嗯,就是有自己的优点,有自己的缺点,那么 我们就是可以选择出只适只适合你当下这个阶段里边来说,比如说你就是要就业的,那么我认为如果你花时间去学这个 呃 c 加加,就是你短短时间要就业的,那花时间去学 c 加加的收益可能就没有学 java 的 大。然后如果说你是现在 呃刚上大一,然后你觉得 c 加加就呃以后想做这游戏这方面,或者呃对一些交易所,然后性能要求高的这方面, 你想去做这个,那这个时候其实去学 c 加加的话来说就是相对比较合适的,呃,就是没有完美的语言,只有适合你当前这个阶段去学的呃语言,对,然后 我大概总结了五种情况吧,一种就是呃已经保研的,然后联系了自己导师,导师可能是做,呃,因为导师都有些项目吗?可能是做这些东西,可能做那些东西,然后 你肯定是要去帮导师去做一点事情的,然后这个时候呢,你其实就呃去联系你导师,然后问问他,就是组里边的一些技术站,然后你提前的去做一些对应的学习就好了,比如说导师有些项目,比如说前后端的,那他可能需要你去学家啊,或者学前端这样的。 然后还有的话就是有一些啊,因为前两天这个考研初分吗?可能有些人上岸了,他要准备这个初试和复试,那么初试复试的时候,可能这导师除了问你,呃,因为你是一个计算机的一个学生吗?他可能除了问你一些, 呃,就是专业上的一些书本上的一些四零八呀这种东西之外,他可能还问你啊,哪门编程语言你熟悉,对吧?然后这个时候呢? 呃你应该选选哪一门语言?说是你比较熟悉的,或者你之前根本就不了解,然后你专注考研去了,然后这个时候呢?你啊选哪一门语言啊?是可以短时间之内快速掌握的,然后有利于你的一个出事, 嗯,见面的一个概率嘛。然后还有第二种情况的话,他其其实就是一些嗯,大二大三的同学,然后他就是零基础,呃, 小白,然后就什么也不懂啊,或者是有一些同学的话,他之前可能是呃别的专业的,比如说像什么 安全的,然后呃像什么明层器的这种专业的,他可能想转到计算机这专业里边来,但是不知道自自己适不适合编程,或者说不知道这个编程那之后能做一些什么,那他呃就是可能呃想要去了解的语言,就和 别的不太一样,就是呃情况二的话就是这种,然后情况三的话就是呃一些要快速去找工作,找实习,春招秋招的一些同学,那他的目标的话,其实就是呃比较明确,就是要拿 offer, 然后呃对这语言的要求的话,就是岗位多,机会大,然后容错率高。 然后还有的一些同学的话,其实是比如说想做一些自己的个人网站,然后想做一个小程序,想做一个小工具,然后方便自己的一些生活,然后呃这种同学的话,他需要去了解 呃哪些语言,然后还有一些同学的话,就是呃自己就想做这个技术的一个深耕啊,追求底层的一个原理,然后学一些硬核的语言,然后这个的话就是呃又该去学哪些语言呢?就是每种 情况针对的其实那个答案呢完全不一样。然后下面呢我将给大家介绍一下,就是呃每一门语言,呃就我所了解的主流的每一门语言,然后它对应的一个优点和一个缺点,然后方便大家呢去做一个选择。 呃首先的话就是 python, 嗯, python 可以 这样说,就是它的生态其实是编程语言里边最丰富的。呃只要你能想到的, 你只要你能想到,呃去做的一些东西,比如说造的一些轮子,那么 python 里边一定有第三方库已已经实现了,所以你可以直接去调库,就不用自己去实现那个逻辑,你只需要呃调一下库,然后把别人的逻辑稍微改一改,然后自己就可以用了。 呃语法简单,然后呃什什么三行代码爬去网页,这是很常见的。 python, 呃,像我大一之前的时候,呃写过一段时间的 c 语言,然后 c 语言的话可能几百行就是一二百行,呃做的事情可能 python 真的 只需要二三十行就做完了,这个的话就是 python 的 一个简洁性。然后而且的话像 比如说你想做后端开发,呃就是 python 有 flex、 fast、 fast 的 api, java 这些框架就很很容易上手,里边可能 摆不多的东西,然后你就可以把这个后端框架给它搭起来了,然后以及做一些数据爬虫,然后做机器学习 transformer, 然后这些的话 python 其实离不开 python, 然后呃自动化测试啊, pandas 的 数据分析啊和 matelab, 呃这些就不用说了,然后自动化运维 一些,所以拍摄他其实是一个大而全,就是呃他足够简单,然后里边内容足够多,就是你想做哪一方面拍摄都可以做。然后 但是的话拍摄有一个缺点,就是纯拍摄开发的岗位其实不太多,就是很多他都是呃像什么做什么算法的,然后做什么大模型微调的,然后这种岗位会要求你会拍摄, 但是就是纯 python, 比如说呃用 python 去做后端开发,然后这种岗位是比较少的。因为 python 啊,它大而全,之后呢就导致它的 整个一个性能其实是呃不太好的,就是它呃可能相比这个构和 java 来说,它的性能会弱很多。但是新手的话就是如果你当前没有一个明确的目标,然后是一个纯新手, 那其实你可以用 python 去做一个入门,然后去写一些小玩具,然后这个是比较合适的,所以新手推荐指数真的五颗星。然后下面的话就是 javascript, 然后我们首先要知道 javascript 和 html css 它其实并称为 这个前端三件套嘛,也就是说我们现在看到的网页,然后呃或者是手机,呃小程序里边的小程序开发,然后呃 就是很多东西吧,就是基本上你能看到的页面展示出来的一个效果,呃都有 javascript 的 一个影子在后面去做一个操纵,因为它是一个虚拟 dom, 然后做什么撞套管理,然后组建开发, 然后呃就是如果你是想做前端开发的话,其实离不开这个 javascript, 你 直接冲这门语言去学就好了。 然后其实 javascript 的 话现在也可以去写后端,写 node js, 然后什么跨屏移动、跨平台,然后桌面应用这些他都可以写。小程序开发更是离不开,离不开这个 javascript。 然后,嗯,如果你是想做这个 前端开发,就是你直接去学这个语言就好。然后前端全站其实都绕不开这个 javascript, 然后它的话其实和 python 差不多,就是它的上手也非常简单, 而且他呃其实现在来说前端和全站的岗位需求量还是比较大的。呃,对,然后但是 你要知道因为现在 ai 发展的很迅速嘛,然后他其实写一些基础的前端的页面已经没有什么问题了,就是我们直接呃给他发指令,让他给我们生成一个前端的一个 啊,比如说一个页面,其实他是做的非常好了,但是啊,大家也不要灰心说。就是哦,那我不能走前端这条路了,就是他 ai 确实可以替代一些简单的一些东西啊,因为我之前和我的一个同事,然后他是微软出来的嘛,然后他是写那个,他就写前端的,然后他也用 ai 口令去写一些前端,然后他跟我说,他说 他感觉 ai 确实是可以写一些页面,但是比如说在项目里边去写的话,他经常啊 不不会去做一些什么组建开发,就是他会直接嗯不把这个东西呢抽离出来,做一个组组建不附用,他就是直接在里面拉一坨,然后呃到人去改的时候。真这个时候呢?比如说你想做一点微调,那么可能你 不管说多少题词,他都改不到你想要的那个状态。然后你自己上手改的时候会发现他没有做这个组建化,那这个时候呢就会导致你非常的难受。所以说呃这个前端开发,其实现在呃可能 我觉得不止钱能开发吧,就是初级程序员这个确实数量在减少,然后其实要求呃你其实要快速的成长到一个呃中级、高级呃或者架构师这样的一个程度,然后去操纵 ai 做一些比较简单重复性的一些工作。 对,然后前端这个 javascript 如果你学这门语言之之后呢?它其实有一个尤其严重的问题,就是前端这块技术卷的很厉害,就是它可能一年半年就出一个新的一个框架,用 buue react 就是 学无止境,真的是学无止境技术,而且你的技术在积累 呃会很快。然后三十五岁焦虑确实可能比别的圈严重一点,就是呃大家就是这个的话,其实他就是他的一个缺点,而且他的调试确实会呃非常的难受。哦,我有这个同学在呃做那个呃 呃我,我有的同学在做一些,比如说这个小程序开发,或者是一些 h 五的一些适配上,其实这个是最烦人的,然后他可能需要去适配 这个华为新出的一些手机,然后或者别的新出的什么折叠屏。然后这这个我觉得比较烦人一点。 然后老生常谈的 java 的 话就是做后端,做大数据开发,做这个移动应用开发,呃,虽然,呃有一个语言也在崛起啊,但是 java 做移动应用开发也, 呃,目前来说也还是可以去做的。然后呃什么中间建,然后呃高可靠、安全稳定第一的这个支付系统, 这个里边其实都有 java 的 一席之地。然后 java 的 话,呃,目前虽然都在有很多人都在唱衰 java, 但是 java 还是,嗯毫无疑问的就是岗位量最大的一个语言。所以如果你是冲就业去的,那我觉得你 去学 java 其实是一个目前来说一个不错的选择。然后学完就,呃,学完之后只要你 只要你学的够好,就是一定能找到工作,因为他的嗯岗位是这些语言里边最多的。对,然后嗯,但是他的缺点其实也很明显,就是他的内卷确实严重,因为可能一百个岗位 可能会有嗯四五百个人和你一起去卷。然后八他的八股纹也是我见过那个语言里边八股纹最多的一个。然后什么 gvm 并发症,可能你工作中这些东西可能真的就用不到,但是没办法,就是得掌握,掌握了之后你 面试才有可能去通过。然后这个也是因为他发展久了,我觉得这这一点无可比拟。然后嗯他的就业的话确实很不错,我觉得嗯新手 如果你一点基础都没有,但是你就是留给你的时间不多了。比如说你现在是大三下了,然后呃也没有之前没有接触过编程这方面,那我觉得你直接去充加了就是一个选择。然后够的话也就是我现在学的这个, 他这个语言确实有很多优点,就是呃可以做后端,可以做呃语音,语音原声像刀客 k 八 s 其实都是他写的,然后做一些运维工具,然后网络编程,其实他都是 呃很很适合的,然后他部署起来也很简单,一个单一的一个二建制文件,然后不用像啊 java 的 那个,他也得装一些什么 gvm 的 讯息机才可以跑起来。 呃它的语法的话,其实呃对比这个 java 来说其实算很简单了,它的语法接近这个 python, 然后部署也方便。但是 啊 go 这语言他的一个缺点就是他的岗位总量其实还是远远没有加完那么多。然后而且他一般是大厂用的比较多啊,小厂的话据据我了解就是现在的一些创业公司其实也嗯更偏向于用 go 一 点,就是 会有这么一个小的一个趋势,然后这是我呃观察到的。然后其实只掌握够这一个语言的话,其实嗯不太够,就是 呃你可以搭配着别的语言,就是呃起码掌握两两门吧,就是如果你只学够的话,因为够他其实没有多少东西,然后后面的话我会出一期够的一个学习的一个路线图,然后告诉大家该怎么学够,然后他有哪些地方是需要注意的, 然后他的错误处理的话确实会被吐槽,就是因为他会有一个简单的一个 if else 去处理这个错误。呃新手的话,我觉得学这门语言也没有问题,然后但是要看你当下是呃哪一种情况的一个人群。 然后下面的话就是 c, 然后 c 的 话做操作系统、嵌入式开发、高性能数据库系统编程、驱动开发, 嗯,这些的话就是这里边还是主要会用到 c, 比如说单单片机上你要跑一个程序,那可能用别的语言的话就太浪费性能了,就是你写 c 还是最好的一个选择。嗯,但是这个 c 的 话 啊,他就是开发效率太低,你可能对着那个代码敲半天,最后出来一个黑框框,然后还经常崩溃,然后还经常打个断点,然后找不到错误,然后这个,呃,我觉得上手难度还是比较大的。 对,然后你说纯 c 的 一些岗位的话,其实,呃,依我,依我了解到的啊,就是纯 c 的 一些岗位可能也确实没有很多,但是大家如果学的话,就是 如果你有这兴趣啊,觉得 c c 语言很符合你的胃口,其实学一下也是 ok 的。 但是他我觉得他学习起来比前面四个都费劲的不少,就是 你要你要付出的辛苦可能确实很大。然后这个 c 加加的话就更是了,嗯,虽然它的性能确实很好,就是可能可能加我跑这个东西要二十秒,那 c 加加可能真的就需要两秒,就是十倍的一个效率。然后, 嗯,它里边这些的话,其实像什么图形学、量化交易,就是这部分东西呢,是不可能被其他语言替代的,因为就得 c 加加来写,就就需要这个呃这么高的一个性能,但是它这学习抖呃曲线呢,是 真的陡峭,然后语法呃复杂到爆炸,然后真的是学 c 加加或者 c c 加加吧,我觉得都需要一到两年才能入门,就是零基础学的话,你的压力会非常大。然后 rap 的 话,这个语言其实, 嗯在最近一两年之内吧,就是我感觉吹的人比较多,然后说什么,呃又有高性能,然后又比较安全,然后怎么怎么样的,就是呃性能也比较好, 嗯,这个的话就是,嗯,很多很多人去这样说,然后,嗯, 但是的话就是虽,虽然 rust 也会有一些岗位放出来,但是,呃你直接去上手就是你的第一门语言,直接去上手,这个 rust 的 话,其实,呃很复杂,很复杂,学习曲线超陡,而且 rust 里边如果你现在出了一些问题, 呃,因为它生态没有那么庞大,可能你出了一些问题,可能就真的就是网上没人遇到过一样的问题,那可能真的就把你给卡死了。 然后它的里边的一些概念的话也很很复杂,对,然后这大概就是 rust 语言,然后,哦上面讲了每一种语言的话,然后 到现在就给大家从易到难排个序吧。就是我觉得首先是 python 最简单,就是最容易上手,然后 java script, 然后这个 go, java c c 加加 rust 后面这三项,如果你真的是一个呃 小白的话,就是零基础的一个编程小白,我觉得真的是,嗯,要慎入,要慎入,因为这个真的很难。呃,对,这个的话就是,呃针对新手的一个推荐的一个排序 啊,对,然后我们最后绕回到我们之前说的那个,比如说我是一个保研的,或者准备考研的,或者准备出事的,这个 如果你联系到你的导师了,然后你导师跟你说了,就是在试什么,然后你记,呃,就是导师要你学啥你就学啥,这听导师就好。然后如果你现在在准备出试,那我觉得你花时间花,呃, 半个月花,我觉得几天吧。然后突击去准备一下这个派送其实也是,就是突击去准备的话也是来得及的,因为派送这个语言它简单嘛。然后,呃,如果大家 想要,比如说一些啊,豆包, deepsea, deepsea, 然后或者 chat gpt cloud code, 然后想通过这种 ai, 呃, 帮你去学这个 python 的 话啊,大家可以呃关注我,然后呃跟我私聊一下,然后我发给大家一个模板,让让它更好的就是题词词模板,让它更好的教你学这门语言。 然后第二个的话就是,呃零基础小白,就是我只想试试,我只想试试看,我只想接触一下,稍微接触一下编程,然后我现在没有很多,一个迫切的一个需求,呃, 对,然后这个时候呢,我其实推荐你去学这个 python 啊,这简单好上手,短时间之内可以出成果。然后学了这个,你如果觉得啊,就是可以,然后也挺喜欢这编程的,你转过来之后,其实再去学其他语言就是会有一定的帮助。 然后情况三的话,就是现在要找工作,找实习,春招秋招的,呃,或者,呃再有一些同学,他可能就是现在,然后到毕业 他要去找一份,就是他之前也没有实习过,然后他呢又想就业,那这个时候呢?呃,你的其实一个要求就是,呃岗位多,机会大,融错要高。那这个时候我推荐你去学 java, 因为嗯, java 的 话虽然说 被唱衰了,但是呃他的, 虽然说 java 被唱衰了,但是他的岗位数量摆在那里,其实你直接呃,但,但是虽然 java 被唱衰了,但是他的岗位数量摆在那里,所以只要你去学,肯下下功夫去学,其实 找到一个工作其实也没有多么困难。对,然后还有一些同学的话,他可能想做自己的个人网站,然后这种的话其实就推荐你或者你想学前端的这个,推荐你先去学这个 javascript, 然后再去学前端那一套, 然后如果你真的是有这个技术追求,追求这底层原理,你就想知道他底层是怎么样的?想做这个技术深耕的话,那你就去学这个 c, c 加加 rust 就是, 嗯,去啃这些比较硬核一点的语言, 然后最后的话,这个是我从不同的那个招聘网站上,然后拿下来的这个语言岗位需求的一个排行榜,大家可以呃看一下。然后 第一名的话啊是 python, 因为他会把很多啊,什么算法工程师,然后大模型微调,然后大模型开发这种都算在 python 里面,所以它是最多的。然后下面的话就是这个 javascript 和这个 ts, 其实也是你学了这个 javascript 之后,其实这个 ts 你 就会了,然后 这个的话就是前端,然后全站的一些人,他的这个需求的话也是比较多的,然后下来就是 java, 然后再下来是 go, 然后是 c 加加 rust, 然后 c 叉吧这些这些语言, 然后大家可以看一下他们的平均薪资, rust 当然是最高的,因为它最难嘛,学曲线最陡峭,所以会的人最少, 就导致他的一个那个薪资是比较高的。然后 go 的 话也是,他里边就是你学 go 这个语言简单,但是他里边真正涉及到一些像什么 k 八 s 刀砍云原声的这部分东西,其实他也是比较难的,所以他的薪资相对来说也也比较高。然后下面就是 python 做这个大模型开发,大模型微调的,然后下面就是这些。 然后二零二五年的一个同比增长的话,就是 rest 和 go 其实增长是比较多的,然后 python 也是, 然后大家可以看一下这个岗位数量,岗位数量的话依然是这个前端全站这块人最多,然后下来的话就是这个 java, 呃,因为 python 这个不是纯 python 嘛,所以就是这个 java。 然后 go 的 话其实相比 java 来说它其实就是腰斩了一半,嗯,所以它的岗位数量确实也比较少。呃, rust 的 话就是更少一点,对,这个的话就是, 呃,以上的话就是新手应该学什么编程语言去入门,呃,我的一个呃建议,然后喜欢的话大家可以点一下关注。

c 语言的重要性大家应该都知道,不过对于学习单面机来说,只需要把最核心的那部分语法吃透就够了,像列表、数据结构这些,前期真的没必要死磕到底,用对方法十五天完全足够了。学完 c 语言就可以直接上手单面机。首先先把对应软件安装好, 两天把函数、变量、循环这些基础搞懂,关键在于多动手敲写代码。接着再花一周的时间重点把数族整数结构体掌握好,这几个在单面机开发中经常会用到的。最后几天搞定函数的封装、整数的操作以及内存管理,能把这些全搞懂,就可以上手单面机的学习。 我已经按照这个思路整理好的一份 c 语言的学习路径图,里面标注了单面机实战中必须要掌握的核心知识点,有需要这份资料的同学留言六六六。

今天咱们来讨论一下 c 语言里面的指征这个东西啊,其实指征呢,它就是一个变量的地址。对,然后呢,它可以让我们直接去操作内存,所以用好了指征可以让程序的效率更高。没错没错, 那我们就直接开始吧,先从指征最基础的东西讲起。好的,咱们先来聊一聊为什么需要指征啊?就这个东西到底是解决什么问题的?你看啊,比如我们写一个函数,想要同时得到两个数的和与差,嗯,就像下面这个代码, 但是呢,主函数里面的 wa 和 sa 还是零,就根本没有被改变,因为 c 语言它函数参数传的其实是一个值的副本。 对,所以函数内部对参数的操作是不会影响到外面的变量的。那这个问题怎么解决呢?这个时候就需要请出我们的指真了。对,我们通过指真把变量的地址传进去,函数就可以直接操作主函数里的变量了。嗯,这样就能实现我们想要的结果了。懂了懂了,那我们接下来就好好说说什么是地址。 在计算机的内存里面啊,每一个变量它都有一个唯一的编号,这个编号就是地址。嗯,你可以把它想象成是你家的门牌号。 然后在 c 语言里面呢,我们用这个取地址计算符和这个变量名结合,就可以得到变量的地址, 比如说这个 n 就 代表了变量 n 的 内存地址。那这个指数变量到底是个什么东西?指数变量其实就是一种特别的变量,它里面存的是其他变量的地址哦,而而不是像普通变量那样存一个具体的数值。这么说的话,那指数变量在定义的时候有什么特别的语法吗? 指真的定义是要指定它所指向的变量的类型。嗯,比如说 int 星 p 就 定义了一个指向整形变量的指真 p。 对, 我们可以把这个指真变量 p 想象成是一个箭头,它指向了内存中的某个地方。我大致懂了,那这个指真的解引用到底是个什么东西? 它有什么用呢?解引用它其实就是通过这个指真去访问或者说去修改它所指向的变量的值。 具体是用这个星号星对,比如说如果 p 是 一个指征的话,那么星 p 就 表示它所指向的那个变量,我们可以对它进行读和写的操作。哦,那你能举个例子让这个概念更直观一点吗?没问题。比如说我们定义了两个整形变量, height 一 等于一百六十, height 二等于一百七十五。 然后我们再定义两个职称, eccl 指向 hat 一, hirocco 指向 hat 二。嗯,这个时候如果我们写 hirocco 等于一百八十,其实就相当于把 hat 二的值改成了一百八十。对,同理, eccl 等于一百六十五,就会把 hat 一 改成一百六十五。我有点明白了。那我们现在要讨论的这个职称和函数, 就是说为什么我们要用时针作为函数参数,它到底解决了什么问题?用时针作为函数参数,其实最大的好处就是我们可以在函数内部直接操作主函数里面的变量。嗯,因为我们传进去的是地址嘛?对,所以就可以绕开直传递的这个限制就可以实现,比如说一个函数返回多个结果这种事情。 哎,你这么说,我想到一个经典的问题啊,就是用时针来实现两个变量值的交换。嗯,这个该怎么做呢?你说的这个问题啊,我们可以写一个 swap 函数, 它的参数是两个 int 类型的指真。嗯,然后在函数里面呢,我们再定义一个临时变量 temp。 对, 我们先把星 p x 的 值存到 temp 里面,紧接着将 py 指向的值赋给 p x 指向的位置, 最后再把 temp 的 值赋给星 p y, 这样就完成了交换。这个过程听着有点绕啊,你能不能解释下,为什么一定要用指真呢? 其实关键就在于我们函数的参数如果是普通变量的话,那它传递的只是一个副本。对,就你在函数里面怎么倒腾都是在倒腾副本。嗯,根本就影响不到外面的变量。 但是你一旦用了纸真把地址传进来了,那我们就可以通过这个地址直接去操作外面的变量了。哦,这样才能真正的完成交换。 懂了懂了,那能不能再讲一讲,怎么用时针来实现把两个数按顺序排列呢?当然可以啊,我们可以写一个 sort 二函数,它的参数是两个指真。嗯,然后我们在函数里面呢,用 if 语句去判断一下这两个指针所指向的值的大小, 如果说第一个数比第二个数大,我们就直接调用刚才的那个 swap 函数,把它们两个的值交换一下,这样就可以了。哦哦,这里面的逻辑判断和函数调用具体是怎么回事儿? 是这样的,就是这个 sort 二函数里面,我们不是要比较两个数的大小吗?对,那我们就是用这个解引用操作符星号对,星号 n 一 和星号 n 二, 这样就可以得到时针所指向的实际的值了。然后我们比较完之后呢,如果说需要交换,我们就直接调用 swap 函数,嗯,把 n 一 和 n 二传进去就可以了。 这样的话,我们整个的这个排序和交换的逻辑就分开了。对,就会让代码的结构变得非常的清晰,而 而且也方便我们以后去附用,这个交换的功能确实方便了很多。那我们现在要讲的这个东西呢,是指征和数组之间千丝万缕的联系。对,其实很多人都不知道,数组名本身其实就是一个指征,这是怎么回事呢?其实在 c 语言里面,数组名它就代表了数组首元素的地址。 哦,比如说我们有一个数组 a, 那 么 a 和 a 零是完全一样的。对,都是第一个元素的地址。既然数组名是一个指真,那我们是不是可以用指真的方式来访问数组的元素呢? 完全没错,其实我们平常写的这个 ai, 它在翻译的时候就会被编辑器翻译成星 a 加 i。 哦,对,所以我们完全可以用指真的方式来便利数组, 而且它会比我们传统的下标访问要更加的灵活,嗯,效率也更高。了解了,那指真的算数运算到底是怎么回事?它和普通变量的运算有什么区别? 指真的算数运算其实就是对指真进行加减整数的操作。比如说 p 是 一个指真,那么 p 加一就表示指向 p 所指向的元素的下一个元素对 它移动的字节数,其实是根据它所指向的数据类型的大小来决定的。嗯,比如说是一个 int 类型的指真,那 p 加一其实是移动了四个字节。这么说的话,这个指真的算数运算在便利数组的时候会特别有用吧? 是这样的,因为指真的算数运算,它是直接根据数据类型的大小来计算地址的。嗯,所以它可以非常高效地去便利数组。 对,不管数组是几维的,都可以通过指真的算数运算加上解引用,直接访问到数组的每一个元素。说到这,我有一个问题啊,就是数组作为函数参数传递的时候,它到底传递的是什么?其实当我们把数组名作为参数传递给一个函数的时候,它传递的并不是整个数组, 而是数组首元素的地址。所以函数的形参其实就相当于一个指真,嗯,它指向了数组的开头。这么说的话,那在函数里面对这个数组做修改,会影响到原来的数组吗? 肯定会啊,因为函数的形参和实参其实都指向了同一块内存地址。嗯,所以你在函数里面对数组进行修改的话,就是直接在操作原来的那个数组。对,比如说我们有一个函数 array set, 它的行餐是一个数值 v 和一个值。 well, 然后我们在函数里面用负循环把 v i 都赋值成。 well, 那 我们在 m 函数里面调用这个 a r s s 的 之后, 原来的数值就会被彻底的改变。明白了,那这个 c 语言里面还有一个比较奇怪的语法,就是数组的下标居然可以反过来写,这到底是怎么回事?这个其实是因为在 c 语言里面, ai 本质上是 a 加 i 上存放的值,对,那加法是有交换率的,因此这两种写法的最终运算结果是一样的, 虽然 i a 语法上是对的,但是它会让代码非常难以理解。嗯,所以我们在团队协助或者说项目维护的时候,还是应该老老实实用 ai 这种写法。对,这样可以保证我们的代码的可读性。 那我们现在来总结一下啊,就是这个指真到底有哪些核心的特性?然后它和数组函数之间到底有什么密不可分的关系? 好的,首先指真,它其实就是一个专门用来存变量地址的一个变量。嗯,然后通过解引用操作,我们可以间接的去访问或者修改它所指向的变量,这是它的一个核心的特性。 所以说指真其实是 c 语言里面非常重要的一个东西呗。可以这么说,而且数组名它其实本身就相当于一个指向数组首元素的一个指针。对, 然后我们用 ai 去访问数组元素,其实背后都是用时针运算来实现的。嗯,当我们把数组作为参数传递给函数的时候,其实传递的就是一个时针,所以我们可以利用这个特性让函数去直接操作外部的数组。 甚至我们还可以利用纸质作为函数的参数,做出可以修改调用者变量的这种输出型参数。哦,这其实也是 c 语言里面非常有特色的一种编程技巧。懂了,那我们在使用纸质的时候都有哪些常见的错误是需要我们特别注意的,最常见的错误有三类, 第一类就是使用了没有出土化的纸质,或者说使用了已经被释放的纸质,嗯,这种纸质也被称为也指针。对 用了这种指针,你的程序就会变得非常不稳定,甚至直接崩溃。还有就是指针的类型和它所指向的变量的类型不匹配,嗯,比如说你把一个 double 类型的指针指向了一个 int 类型的变量,那你在访问这个变量的时候就会出现意想不到的错误 哦。还有一个就是忘记写解,引用符号对,你直接把一个地址复制给了指针,结果你本来想改的是那个变量,最后却改了指针本身。 这种错误也很隐蔽。今天我们把指正的基本概念,它的运算,以及它在函数和数组里面的一些高级的用法都讲了,然后我们也盘点了一下大家平常特别容易踩的一些坑。没错,那今天就讲到这里吧,咱们下次再见吧,拜拜。拜拜。