欢迎大家来到阿联老师的 c 加加课堂,今天我们来学习 c 加加的数据类型之间的转换。我们先回忆下我们之前学过的数据类型, 在谢佳佳中,基本数据类型包含整形浮点型,字符型,布尔型。整形呢,又分为 shout, 短整型,我们用面量 a 来表示,给他负一个值。好,基本整形 int b 同样给它负一个值,然后长整形 long long c 也给它负一个值。浮典型呢,我们讲了三种,那常用的呢?是 float, 我们让 等于一点一代表小数 double e 等于也是一点一,然后 double 我们这里用的比较少,就先不解了啊。字符型, chair 字符,我们用引号引起来单引号,然后我们还学了 boar 形 g 等于 boar 值呢,有处和 boss, 我们可以用整数一和零来表示,那我们这里是一把一代表。真 好,我们把 c 加加的常用的基本数据类型写在了这里做了定义。下边我们来讲一下如何来判断我这个变量是什么类型的数据呢? c 加加中 提供了 tip id 关键字,用于获取类型信息,它的返回值呢,是存储类型信息的一个类对象。 tip 音放, 我们通常用 tap id 这个关键字比较两个变量是否是同一类型,比如我们可以这样来写, see out 输出一下 tap id 啊,变量 a, 哎,我们要看 a 这个类型和 type id b, 电量 b, 他们两个是不是同一种类型,那么我可以通过他快递这样做比较,然后我们可以输出看一下结果。零零,我们上节课讲说他代表的这是什么呢?就是 word false 啊。那我们怎么去获取这个变量的类型名字呢?我们可以这样去做, pep id a 变量 a, 它是哪种类型呢?我们可以写个点,还有个方法,这个对象的有一个 name 方法就可以获取到我们 a 这个变量它所属的类型的名字,我们可以看一下它的返回值, 哎,返回一个 s, a, 我们看在定义的时候呢,它是 short, 是代表的是 short 这个数据类型,我们可以依次看一下每种数据类型分别用哪个字母来表示。好老师这里把每一个变量呢,它的 类型返回值呢?都做一个输出,我们来依次看, s 是 short, i, int 基本整形 x 是 long, long f 代表 float, d, w, c, chair 壁纸布,除了浪浪用的是 x, 其他都是用了我们类型定义的这个关键字的首字母,所以还是比较好识别的。 下边我们就来看一下不同数据类型之间他们的转换。我们先看隐私转换,什么是隐私转换呢? 我们如果不同的类型的数据在进行运算时呢? c 加加会首先将两种类型转换成统一的类型,然后再运算,那这种转换 就是演示转换指示佳佳在运行时内部的转换。我们通过输出来看一下每种类型之间是如何转换的。 我们先看 shot 和 int, shot 变量 a 和 int 变量 b, 我们让做一个加法运转,输出一下 a 加 b, 然后我再输出 tap id a 加 b, 哎,我说出他们相加以后是什么类型,我们把它的类型名字返回一下, 好并异形我们看一下,在这里就说一个二 i, 那二呢,指的是 a 加 b 的值,那么 i 呢?指的是我们 相加以后呢?它是返回的是 i, 让我们看 i 是 in, 也就是说计算机会先把完整型变量 a 转换成整形, 然后呢再进行计算,最后呢结果也是一个整形好,这是短整形,会隐示转换为整形。下边我们来看 int 和啷啷,那这里就是变量 b 和变量 cb 加 c。 好,我们运行一下。好,我们看输出的结果是二 x, 那 b 的值是一, c 的值也是一,然后 x 代表的就是我输出的类型,我们可以看 x 呢是 long long 长正形,那就是什么意思呢?就是我们的整形变量 b 首先转换成 朗朗长正形,然后呢再与 c 进行计算,最后的结果呢还是朗朗类型好。那么刚才咱们说了, shelter 短正行会自动转换成 int 整形,然后整形变量呢,它会自动转换成什么呢?啷啷,那么如果 sout 和啷啷呢? 哎,我们肯定是要将 shout 短整型转换成什么呢?啷啷长整形啊,那我们再看啷啷和 float 这两个类型,他们之间会是怎样的?饮食转换好,啷啷是 see vlog d, 那我们看一下 c 加 d。 好,我们编译运行一下。好的,我们看一下结果,结果是二点一 f, 那么二点一呢,就是 c 加 b 的值,一加一点一,最后的返回值呢是 f float float, 那么它就是将我们长整形 啊,先转换成浮电型,然后呢再进行计算,最后的结果呢还是浮电型好。那同样的,我们把下边一起来看一下单净度浮电型和双净度浮电型他们之间是如何来转换的。 d 加一。 好,我们看二点二,一点一,加一点一,二点二,然后最后返回的是 d, 也就是返回指是 d, 也就是是 double, 是双精度福建型。 好的,那接下来我们来看 chair, 我们看前边都是数字数值,而下边这两个呢, chair 似的,是字符, 不是一个逻辑值,那么他们之间是如何进行转换呢?咱们来看一下,我们来看一下短整形和字符形他们之间是如何来进行转换的? a 和 f, a 加 f 的值,然后我们再看一下它是什么类型,哎,结果出来了,我们可以看五十 爱,哎,看看跟你想的一样吗?爱是什么呢?是 it, 为什么会是爱呢?好,咱们来一起看一下。 我们说字符型呢,他在参加预算的时候呢,计算机内部会使用他的阿斯科马,咱们可以看一下前边老师讲的视频,在讲字符显示出去的时候呢,哎,字符都是通过阿斯科马的方式来进行存储的,那么阿斯科马呢,他会认为是掌型, 所以呢字符形呢?其实我们如果在运送的时候呢,可以把它认为是一个整形数据,那么整形和短正形的话,他返回的口音就是什么呢?是整形。那这里值为什么是五十呢?我们来看 f 的值是字符一, 那么零的阿萨克马,我们之前有说是四十八零,后边呢这个一他就是四十九,所以 f, 他的阿萨马这是四十九,四十九,再加上 一,所以就是五十。那么这里咱们知道字符形呢,可以当做是整形来对待的话,如果字符形数据和朗朗来进行计算的话,它的结果应该是什么呢? 是什么类型的?因为我们整形和浪浪,他的结果是浪浪,那么制服型和浪浪呢,结果肯定也是 同样的,如果说字符型和 log 的话,它的结果肯定就是 log。 我们来看布尔雷形,布尔雷形其实就更简单了,它只有两个值处和 boss, 那么它在存储的时候呢,就是一和零,一就代表处,零就代表 boss, 所以布尔值在运算的时候呢,同时会转换成 int 整形。那么我们布尔类型和 short 类型的数据,在运算的时候,它的结果会是什么类型呢?哎,对了,它会是 int 整形,我们可以来看一下 n 加 g, 我们编语运行一下,我们看结果是二,因为呢负尔值呢是一,我们在这里是一,加上完整形的一,结果是二,然后 它的返回值的类型呢是 i 是 h, 那布尔类型和 double 它的返回值会是多少呢?相信你们一定能答对,是不是啊,肯定就是 double, 我们可以看一下 e 和 g, 好,结果就是二点一 dw。 那么如果说字符型和布尔型这两个数据,如果进行运算的话,它的结果返回的会是什么类型呢?咱们可以想一下, 这弧形呢,他在运算的时候会隐私转化成 in 整形,沃尔型呢,他也是转化成 in 整形,所以他们两个如果做运算的话,那结果肯定也是什么呢?哎,整形呢,咱们来看一下,是不是啊? fg f 加七,我们编译运行看一下,哎,结果就是五十 i i eight。 通过刚才我们的书结果,我们可以得到一个结论,什么呢?就是 数据类型之间的演示转换,他是从小类型到大类型自动完成转换。好,那如果有这样一个练习题,咱们来看一下, 我们呢输出六除以四的值,那么咱们看一下六和四都是什么呢?都是整数,而他的返回值的结果呢?我们可以看他也是一个 整数,是一,那如果我想让他输出一个小数怎么办呢?哎,前面我们说我们的 整形数据会自动演示转化成啊浮点型数据,那我是不是可以把这里这个六或者四,把其中一个写成小数呢?写成浮点型数据,比如说六是不是就六点零呢? 那么六点零他就是一个浮电型数据了,那浮电型数据和整形数据进行除法预算的时候,他的结果会是什么呢?哎,会是浮电型数据,那我们看一下结果,哎,就是一点五是不是得到了我们的正确的结果? 在家除了隐私转换外,他还提供了强制类型转换。那么如何做强制类型转换呢?我们来一起看一下。强制类型转换呢?有以下这样几种方法。第一种方法就是先要写 像我们类型的关键字,比方说如果是想强制转化成整形,就写 int, 如果强制转化成浮典型呢,就写 note 后边小包里边呢是一个表达式,是我们要转换的这些数据,它可以是一个变量,也可以是一个式子。 来举个例子,比方说我们看这里定义我们 b, 它是一个 eight 整形,那我可以通过啊 float 把它强制转换成浮点类型,那怎么转换呢?我们可以这样写, blot 小括号 b 关键字,然后括弧里边呢是我们要转换的数据。好,我们输出一下它的类型,看一下它是不是转换了,把它呢放到我们这个输出的类型里。 好,我们看转化的结果,我们看说出一个 f 就是 vlog 类型,也就是现在呢这个 vlog b, 它的值呢是一个浮点形式金,也就是说将 b 转化成了一个 浮点形形句,这是第一种转换的方法,关键字括号。然后第二种方法呢,我们可以把关键字用小括号括起来,然后后边是表达式。那我们再写一个,比如说我们想转化成 w 类型,可以这样写小括号 do, 然后后边呢写上我们要转换的式子,比方说我想将 see, 浪浪这个变量转换成 do 类型,然后后边可以写成 see, 把它呢放到这里边来,输出一下,最后转放的结果, 输出 d w, 这是第二种强制类型转换。然后第三种呢,我们可以在关键字和表达式上都加上小括号,这种写法也是可以的, 就是这样,关键字加小括号,后边的表达式也加小括号,变异运行,那也进行了转化。 好,刚才讲的这三种方法呢,其实都是一个意思,只不过斜把上不同。那我们看第四个方法,第四个呢,可以用 指定类型的变量负值,什么意思呢?比如说我这里定一个整形电量 b, 然后我可以这样给他负值, b 等于四点五,那实际上 b 的值会输出的时候是多少呢?咱们来一起看一下。 哎,我们看他输出了一个四,为什么呢?因为 b 他是一个整形变量,所以我们在给他复制的时候呢,他会将后边这个数值强制转换成整形数据,然后复制给我们的整形变量 b。 好,我们来做一下这些练习,看一下你能不能完成。第一个 set, 十一除以五,那十一是一个整数,五也是整数,那么它的结果会是多少?嗯,返回值也会是个整数,所以是二。 好,我们来看下一个 set double, 十一除以 double 五,在这里它进行了强制转换,将整数十一转换成双精度浮点型,五也转换成了双精度 浮点型,那么他相处以后,结果是 w 类型,所以是二点二。我们看这个,这个的写法跟上面不一样,但是意思是一样的,只是把关键字用括号括了起来,那他的结果应该也是一样的,是二点二。我们再看下边这一个, 这个呢,我们将十一转化成了 double 类型,五还是整数。那么这个在做计算的时候呢,他其实会有一个隐私转换,因为十一是 double, 那这个整数五呢?在计算的时候,先转换成了一个 double, 然后最后的结果 还会是 double, 所以他也是二点二。那我们来看最后这一个,有没有人会告诉我这个的值会是多少呢?他同样转换成了 double, 但是呢,他的括弧里边呢,这个表达式是两个整数进行相除, 那他会这样计算,他会先计算十一除以五的结果,然后把这个值呢再转换成 double 进行输出。那十一是整数,五也是整数,十一除以五呢,他的结果就是二,二转换成 double 也还是什么样? 还是二,对不对啊?来,我们来看一下结果。好,我们看是不是跟你想的一样呢? 好,我们的强制类型转换呢,就讲到这里,那不管是隐私类型转换,还是强制类型转换,我们都要遵循由小到大的原则, 这样呢才能确保数据的安全。如果大数据的类型转化成小数据类型,会发生什么呢?我们可以做一 练习来看一下。在这里呢,老师定义了一个整形变量 i, 然后呢我们又定义了一个长整形变量 g, 然后他有一个很大的一个数值,然后呢,我们通过负值的方式将这个值呢强制转换成整形,然后负值给爱 我们看,结果是错误的,跟之前这个值并不相等了。就是说我们大数据类型转换成小数据类型的时候,就很容易发生溢出,这样呢我们的数据就会出现错误。 所以老师说我们不管如何进行转换,都要遵循从小到大的原则来确保数据的安全。 好的,今天的关于 c 加加的类型转换,我们就讲到这里,拜拜。
粉丝1266获赞5489


今天我们来看一道笔试题,这个笔试题呢,非常简单了,看这个题目就是说给你一个有方数,再给你一个无方数在 a 和 b, 然后呢把他们的加起来,问你呢,最后呢,这个结果是什么? 你试做一下,那么这道题呢,与其说是考我们的这个 c 语言,还不如说是考我们细心程度,那么如果说我们是做题目比较细心的,那应该是做对的啊,粗心一点会踩坑了。 再看我们这个 a 和 b, 一个是负二十,一个是六加减乘这个负数,那如果是个负数的话,根据最下面一条代码, a 加 b 的 这个叫做条件判断式,那肯定是小于零,那肯定你就可能会写这个小于六了,那是错的, 答案居然是大于六,那有的人就蒙了,为什么一个一个六跟一个负二十加起来,那不是负十四吗?肯定是个负数啊,这个大于六呢?其实呢,这个就要考虑到我们的 c 语言,它是一门这种计算机语言,它并不是数学表达式,你不能把它当数学计算,因为呢,我们这个数值呢,这个六啊,它是一个无符号数, 那么当无符号数跟有符号数放在一起运算的时候,他设计一个基本的概念,叫做类型转换,那么你要回忆这个类型转换的方向了,那究竟是把有符号转成无符号,还是把无符号转成有符号呢?那么最终的结果是转成无符号,这负二十会不会转成无符号? 那你想本来它是个负数,你把它转成一个无符号数,那不就变成一个很大的数吗?那这两个数加起来,那不就等于一个巨大无比的整数了?所以最终的答案呢?其实它是一个很大的整数,远远大于六, 这就是这个题目的一个坑。你在评论区里面也可以扣一下我们遇到的一些更加奇葩的简单的笔试题,有的我们可以一起探讨一下。

什么是 c 语言的数据类型?屁老板给凯伦准备了两个专属小铁盒,方便沟通。不上锁、内容可以随时更换的变量盒子,合上了锁内容永远不会改变的常量盒子。但每次往盒子里装东西,有时候能顺利装进去,有时候应 塞就直接出问题,还报错。其实道理特别简单,不同的东西就得用大小规格合适的盒子,不能随便拿个盒子就乱装,放到 c 语言里。这个规矩就是数据类型。皮老板挑出自己最常用的三种盒子,日常和凯伦沟通,大部分场景靠这三种就够用。整形硬替盒子 最小的方盒子,专门装没有小数点的整数,比如在一起的天数、通密方的次数,都可以用它来存。浮点型,浮了的盒子,宽一点的盒子,专门装带小数点的数。比如需要精确一点的数值比例积累的内容。 字母型叉细长的小盒子,一次只能存放一个字母、一个符号或者一个标点。比如凯伦手字母 k, 写纸条用的爱心 炸毛时的感叹号,都用它来存,根本不用死记硬背,看一眼用途就知道该用哪种盒子。其实写代码一点也不复杂,就这一行,你看懂意思,就能写出最简单有效的一句, int。 心意等于五百二十。翻译过来就是用一个整形的小盒子,给它取名叫心意, 往里面放进数字五二零。最后告诉凯伦,这句话说完了,凯伦一看就懂,清清楚楚,不会出任何错。 盒子类型别用错,每个盒子要有清晰名字,就能避免绝大多数错误。学 c 语言也是一样,理解了这些最朴素的道理,就一点都不难。那你知道凯伦的生日应该存入哪个盒子吗?评论区告诉我答案,关注我,用最简单的方式,慢慢看懂 c 语言。

c 加加的四种强制类型转换分别是什么?隐式类型转换又需要注意什么?这节课我们一起来看看 c 加加的类型转换。 咱们先来说说什么是隐式转换,对吧?嗯,他在程序翻译的过程当中到底是怎么工作的?隐式转换他其实又叫做自动转换,嗯,就是说在翻译的时候,翻译器会在你没有明确告诉他的情况下,把一种数据类型自动变成另外一种数据类型。哦,比如说把一个整数变成浮点数, 然后它背后的目的呢?主要是为了防止精度丢失,保证你这个运算的逻辑是对的。那能不能举个例子,就说这个影视转换,它在运算当中具体是怎么表现的?可以啊,比如说有一个代码是这样写的, int i y l 等于三点五四一加三,嗯,那这个时候呢?三这个整数会被自动转成三点零,然后跟三点五四一相加,得到六点五四一, 但是因为 i while 是 整形,所以最后会截断小数部分,结果就变成了六。明白了,那我们再说说这个翻译器到底会在哪些情况下自动帮我们做类型转换。其实翻译器会在很多场景下帮我们做这个事情,比如说在表达式里面,比 int 小 的整形, 像 char 和 short 会先提升为 int 或者更大的整形类型,之后再运算。哦,那除了表达式运算之外,还有什么地方会发生自动类型转换呢?比如说在 if 或者 while 这些条件语句里面, 如果你的条件不是一个波尔类型,那它会自动转成波尔类型。嗯,还有就是你在赋值的时候,右边的值的类型会自动转成左边变量的类型。 包括你在函数调用的时候,时差也会自动转成行差的类型。好的,那下面咱们讨论一下常见的表达式的转换。比如说这个三点一四一五九 l 加上字母 a, 这个里面会发生什么样的类型转换? 这里会发生两次转换,首先字母 a 会被转成整形,然后这个整形再转成 long double。 对, 最后就是 long double 类型的运算。那如果是不同类型的变量做运算呢? 比如浮点型和整形,或者说单精度和双精度,这里面又会怎么转换?如果是浮点型和整形运算的话,整形会自动转成浮点型。嗯,比如说一个 double 和一个 int 相加,那 int 会被提升成 double, 然后再进行计算。 哦,所以就是说总是往更精确的那个方向去转。对,那赋值的时候呢?会不会有什么特别的?赋值时可能发生精度损失或羽翼转换? 如果你把一个 double 类型的值赋给一个 int 类型的变量,就会发生截断,丢失小数部分。如果你把一个浮点数赋给一个波尔类型的话,非零值会变成处,零值会变成 false。 哎,你说这个自浮型和各种整形,包括无符号整形在一起运算的时候,会有什么特别的转换规则吗?当然有了,比如说自浮型和单精度浮点型运算,那自浮型会先提升成整形,然后再一起转成单精度浮点型。 如果是短整形和自幅型预算的话,他们俩都会提成成整型,然后再计算。明白了,那如果是有符号和无符号的各种整型在一起预算呢?这里面的规则会不会更复杂一些?确实会更复杂一些,比如说整形和无符号长整型运算,那整形会变成无符号长整型, 然后短整形和整形运算的话,结果可能是整形或者无符号整形,这个取决于你系统的位数。 还有就是无符号整形和长整型运算的话,结果通常会是长整型或者无符号长整型。咱们展开说一下数组名到指向的隐式转换。嗯,这中间的核心规则是什么?其实很简单,就是你在大多数的表达式里面用到数组名时,它会被自动转成一个指向这个数组第一个元素的时针。 哦,比如说你定义了一个数组 int i a 十,那你在使用 i a 的 时候,它其实会被隐式的转成一个指向 i a 零的时针。 这么说的话,就是我把数组名直接复制给一个指数变量,其实是在操作数组首元素的地址呗。没错,比如说你写 int 星 ip 等于 i a, 那 这个时候 ip 里面存的就是 i a 这个数组第一个元素的地址。 好的,我们接着往下说这个不尔转换和常量转换。嗯,先说不尔转换吧,就是哪些值会被转成 false, 哪些值会被转成 true。 在 c 加里面呢,所有的算数值和指值值都可以隐式地转成不尔值。嗯,具体来说呢,就是零值和空指值会变成 false, 其他的非零数值和有效的指值都会变成处。那这个常量转换呢?就说我这个非常量对象转成常量对象,这个在实际编程里面有什么用呢?它的作用其实就是给你的数据加上一个保护罩。嗯,就是你可以把一个非常量对象隐式地转成常量的版本,然后这个数据就不能再被修改了。 但是反过来,你不能把一个常量引式地转成非常量,因为这样做其实是不安全的。行,那类类型转换和特殊指征转换这两个东西在 c 加里面是怎么用的?呃,先说类类型转换吧,就是你可以在你的类里面自定义一些转换规则, 比如说 c 加标准库里面的 string, 它就允许你把一个字符串字面值直接赋值给一个 string 的 对象。还有就是你可以用输入流对象,比如说 sin, 在 条件判断里面,它会自动地转成一个不尔值, 然后如果这个流是正常的,就是 true, 如果遇到了文件结束符或者是有错误了,它就会变成 false。 了解了。那特殊指征转换又是什么东西呢? 特殊指征转换就是你可以把整数、长量、零或者 null ptr 转成任意类型的指征,这个就叫空指征转换。 还有一个就是万能指值 void, 你 可以把任何非常亮对象的指值转成 void, 但是你不能直接对 void 星进行解引用,你得先转成原来的类型。好,我们再讲一个稍微有点难度的东西,就是显示转换,也叫强制类型转换。 那这个东西在 c 加里面,它的核心定义是什么?它跟我们刚才讲的那些影视转换最大的区别是什么?其实显示转换就是你作为程序员,你主动地用一种特定的语法让编辑器帮你做类型转换。 比如说你要把一个 double 转成 int, 这种编辑器不会帮你自动做的,你就必须要自己写出来。明白了,那 c 加里面,它是用 custom name type expression 这样的一个语法来做强制类型转换的。 cost name 呢?可以是 static underscore cast, dynamic underscore cast, cost underscore cast 或者 reinterpret cast, 它们分别适用于不同的场景。能不能给我们稍微详细地讲一讲,这几种 cast 具体都用在什么地方?好的, 首先 static 下划线 cast 它是最常用的,它可以用来做一些基本数据类型之间的转换。嗯,比如说把一个 int 转成 double, 还有就是在类的继承里面,把子类的职称或者引用转成副类的,这种向上转型也是可以的。听起来这个 static test 好 像很万能啊,那其他几个呢? dynamic cost 它就只能用在有虚函数的类上面,它可以安全地把副类的职称或者引用转成子类的,这就叫向下转型 哦。然后 constast 它是比较特殊的,它可以把一个变量的 const 或者 volatile 属性给加上或者去掉。还有一个 renooper cast, 它是用来做一些底层的重新解释的,比如说把一个指真转成一个整数,这种非常底层的操作。懂了懂了,接下来我们来看看这些转换方式具体如何使用。 先来看 static, 嗯,它主要就是用在基本类型之间的转换,比如说把一个 int 转成 double, 或者是把一个 float 转成叉,这种都是可以的,只要不涉及到 const 属性,一般都可以用它。比如说你要计算两个整数的除法,但是你想要得到一个浮点数的结果,那你就可以这样写, statcast, 后面的尖括号里写 double, 表示转换的目标类型,后面的小括号里写需要转换的值,比如我们代码里的 j, 这样就会形成一个 double 类型的值,如果将它作为除数,那么结果也将会是 double 类型。 明白了,我们再来看看 constcast 的 使用,它是 c 家里面专门用来操作 const 属性的,它可以把一个常量的属性给去掉,或者是给它加上 啊。比如说你有一个 const 叉星 pc 等于 test。 那 如果你想要用一个普通的 c h a r 星指征来指向它的话,你就必须要用到 const cost。 那 我通过这个新的指征去修改它指向的内容,会发生什么事情呢?这个就很危险了,因为如果你原来的那个对象是一个常量,嗯,那你通过 const cost 去掉了它的 cost 之后再去修改它,结果是完全未知的, 程序可能会直接崩溃哦,也可能会出现一些莫名其妙的错误,所以这个东西用的时候一定要非常非常的小心。那这个 reinterpret cast 又是什么东西呢?它一般会在哪些场景下使用? reinterpret cast, 它是用来做一些非常底层的位模式的重新解释的。 嗯,比如说你有一个 int 的 指征,你想把它转成一个叉的指征,那你就可以用 reinterpret cast 来做 哦。听起来这个东西好像很强大啊,那他有没有什么风险?当然有了,这个东西的行为完全依赖于你的硬件平台和操作系统,嗯,他是完全不可移植的,而且非常的危险,所以你一般只能够在跟硬件打交道或者是系统编程的这种非常底层的代码里面才会用到。他了解了, 那 c 语言风格的强制转换,它的语法是什么样子的?呃, c 语言风格的强制转换,那很简单,它就是直接在你要转换的表达式前面加上用括号括起来的目标类型。嗯,比如说有一个整形的指贞 int 星 ip, 那 你要把它转成叉二星的话, 你就可以直接在 ip 前面写上小括号,小括号里写叉二星。好的,那它跟 c 家里面的这种强制转换相比有什么缺点吗? 最大的问题就是他太万能了,他没有区分不同的转换类型,所以你很难从代码里面看出来作者的意图是什么。而且在一些很复杂的项目里面,他很容易导致一些难以发现的类型错误。那我们最后来总结一下, 首先是引式转换,这是翻译器自动完成的,原则就是尽量别丢精度,常见于算术运算条件判断、赋值和传参。 然后是显示强制转换,需要程序员手动指令触发。 c 加加主推 staticcast、 constcast 这些类型安全的转换符尽量不要使用老旧的 c 风格转换。 这里还要记一个关键,考点,数组名在多数场景下会自动转成指向首元素的指向,这也是隐式转换的一种典型应用。 最后给大家两点最佳实践,第一,一定要吃透影视转换规则,避开常见的精度丢失类型不匹配陷阱。第二,非必要不做类型转换, 必须转换时优先用 c 加加风格转换符,让代码更安全,更好维护今天的类型转换就讲到这里,我们下期再见,拜拜。

hello, 大家好,这一课我们来一起了解一下数据类型转换。 首先我们要考虑一个问题,为什么会有数据类型转换呢?其实最主要原因之一就在于人家 c 语言将不同的数据分为不同的类型, 就比如说我们再去使用数字的时候,数字呢,它给我们分成了有 int 类型,还有 short 类型,还有什么 long 类型,还有 float 类型, double 类型,对不对?比如说它这个整数呢,就分为了,哎,这三种啊,小数的话呢,两种对吧?当然还有一些长的那些类型啊,我们就不再去说了,好吧, 好,那么他分为不同类型以后,那他这里边再去存储数据的时候,就会产生一些新的问题,就比如说我们现在的话呢,有一个数字现在是一,然后计算一加上一点五,那么这时候我想要去拿到结果的时候,那应该怎么办呢? 对于我们自己的意识里边,我们直接就给他换算出来了,就等于二点五,对不对?但是对于 c 语言来说的话,他再去换算的时候,底层会怎么去做呢? 首先我们先要先要去拿到这个一的这个变量,对不对?这个一的话呢,咱们一般情况来说会把它分为哪个类型啊?会分为这个 int 类型对不对?好,那除它以外的话呢,咱们还有就是这个一点五, 这个一点五的话,我们会把它分成什么样的一个类型呢?我们一般情况来说可以给它分成叫做 double 类型。那么问题来了,这个 int 类型,这个 int 类型和这个 double 类型能不能直接进行混合运算呢? 答案是不能的,在这个 c 语言里边,他在如果说是不同类型的话,他要进行预算,先要统一数据类型,因为他毕竟底层分配的这个空间是不一致的, 对不对?那么只有统一的空间,他们才能知道如何进行相的一个表达, ok 吧?好,那么也就说他需要将一转成一点零,大家都是小数的,好,那么再进行计算,获得结果, ok 吧?这时候就会涉及到一个问题, 一,是不是要转成一点零啊?那也就说他要将整型转成小数,也就是浮点型,这就是数据类型的转换, ok 吧?好,这也是为什么要有数据类型转换的问题啊。好,那么我们知道这个数据类型转换了以后,然后接下来的话呢,我们来看一下它的概念啊, 那类型转换呢,其实就是将一个数据类型的值转换成另一个数据类型的值,那变量之间的这个类型转换呢?是可以进行互换的。注意了,这是变量,那这个变量指的什么意思?就比如说我们在这定义了一个 int, a 等于数字一,那我们能能不能把 a 的 类型换成其他的呢?有时候把这个 int 类型给它换成其他呢?答案是可以的,有时候咱们改的是这个变量的这个数据类型,那比如说我现在有一个常量一, 那我能不能把这个常量变成一个小数呢?哎,答案是不能的,因为他已经写死了,对不对?常量的概念是什么呀?是不允许去修改嘛,对不对?所以说的话呢,常量是不改的啊,我们在做数据类型转换的时候,一般转的什么都是人家变量的这个数据类型啊,这个咱们一定要清楚, 好,那么除他以外,还有就是咱们一定要了解人家 c 元的数据类型转换,那么他在去转换的时候呢,有分为两大类,第一大类就是隐式的啊,隐式的类型转换,那么我们也可以把它称之为叫做自动类型转换,比如说这两种方式其实是一种方式, ok 吧? 好,那么还有第二大类就是显示类型转换,叫做强制类型转换,这两种方式也是一样的, ok 吧?好,那么隐式类型转换的话呢,它是发生在 不同数据类型的混合运算时,它会自动的为我们进行相应的一个转换,那这个转换的话呢?是由谁来做的呢?是由编程来自动完成的,这个编程说白就是咱们自己安装的这个 c 的 这个编程, ok 吧?那也就说我们不要去写,不用去写额外的代码,它自动的就给我们进行相应的完成了, 那他再去转换的时候,肯定要去遵循一些规则,对不对?那这个规则都有哪些呢?我们来一起去看一下。首先第一点就是参与预算的这个类型,发现不同时,人家就会先去将这个类型呢 统一成一种类型,然后再进行预算,这个就比如说我们刚才说的一加上一点五,那么这时候他怎么去运算呢?他先去统一成同一种类型啊,比如说全都转成小数,然后再进行运算获得结果, ok 吧? 好,那么问题是它统一称小数呢?还是统一称整数呢?哎,这个东西咱们就要去看它另一个规则,它在转换的时候呢,会按照数据的长度的增加的方向来进行转换, 为的目的就是保证精度不降低。指的什么意思?比如说我们这的话呢,有一个 int 类型,有一个浪类型,我们想想这两种数据类型,谁表示的数据范围比较广呢? 是不是浪类型啊?所以说的话,哎,它会将这个 int 类型转成浪类型, ok 吧?好,这是这个意思。再比如说我们现在有一个类 int 类型, 还有一个浮点的 double 类型啊, double 类型,那么问题是他们之间在进行换算的时候,我们会把它去转,怎么去转换呢?他会去把 int 类型转成 double 类型,为什么呢?因为 double 类型表示的这个数据的这个广度更大一些, ok 吧,好,这是这个意思啊,比如说他会根据这个数据的长度来进行向那个转换,往上进行向那个转换 好,那么所有的浮点类型在去预算的时候,都会以双精度的进行运行,即使说这里面包含了单精度的运表达式,那么它也会去转成 double 类型啊,这时候这个东西咱们一定要清楚,也就是小数的话呢,它基本上都是以 double 类型进行相对的转换,这个计算的 好,除它以外,还有就是叉儿类型和少的类型呢,参与计算的时候都会去转成 int 类型,也就是说他虽说占用的空间比较少,但是没有关系,人在去计算的时候呢,都转成 int 类型了,这样的话呢,表示的这个数字之范围会更广,那么我们可以考虑一下,为什么要转成 int 类型呢? 就比如说咱们叉儿和少,它表示的范围是不是数字比较小啊,那比较小,如果说这两个短类型一加出来一个什么呀?超出范围的,那这时候怎么去 怎么怎么进行计算呢?好,他用 int 类型正好可以进行存储,对吧?好,这是这个意思啊,好,当然这只是咱们考虑的,但是实践来说的话呢,它底层我们知道转成 int 类型了就可以了,好吧,好,那么这是这块。 好,那么还有一个就是在赋值运算的时候啊,赋值运算的时候,那么赋值运算是指什么意思呢?就是当我们定义一个变量,比如说我们定义一个变量 a, 然后等于一, 咱们是不是把右边的给左边了,那么在这个时候呢,就叫做复制运算,那复制运算的时候,如果说发现两边的数据类型不同时,那他会怎么做呢? 他会把右边的类型转换成左边的类型,那比如说的话呢,我们在这写了一个什么?写了一个叫做啊, double, double a 啊, double a, 那 么这也说左边的话呢,是浮点类型,右边的话呢是这个整型,对不对?那么他会把这个一的话呢,转成这种浮点类型,转成一点零,然后再去给 a 进行相应的一个赋值, ok 吧?好,那么这是这块儿, 那么如果说右边这个值的话呢,长度比左边长,那这时候呢,他会去丢失一些相应的精度,那丢失这个精度的话呢,按四舍五入进行相应的一个存储, ok 吧?那这个指的是什么意思?比如说我们在左边的话呢,定义了一个 int a in 的 话,它是不是一个整数,然后的话呢,我们给它赋值三点一四,好,那么三点一四是不是它有小数啊?小数的话,那这时候呢,就会被舍弃掉啊?那么舍弃掉的话,那是进位呢?还是还是这个舍弃掉呢?那就根据它这个小数了,如果说,哎, 大于五的话,那么它就变成四了,如果小于五的话,它就什么直接舍弃掉了,是这个意思, ok 吧?好,那这是它一个怎么去进行相对计算?所以说的话呢,它在类型转换的时候,我们一定要注意它是怎么进行存储的。首先 如果说是一个表达式的时候,他们会去向上进行向的一个转型,那如果说是把这个式表达式往左进行向的复制的时候,他会把这个右边的转成左边的,这个咱们要清楚,好吧?好,那这是他一个转换的一个规则啊。 好,那么咱们再去详细的去看一下这个隐士转换,那么隐士转换的话,其实也可以称之为叫做自动类型转换,这个咱们应该是清楚的,对不对?那他在去发生的时候是什么时候呢?一般情况来说就是自动类型的时候,就是自在表达式中自动发生的,无需咱们进行指令调用。 那么通常情况来说的话呢,就是由小的类型转换成大的类型,那如果说咱们把大的类型转换成小的类型, 可不可能他会去运行呢?答案是可能,那么这时候呢,程序可能会给我们相应的这个警告, ok 吧?好,那么我们再来说,不给警告的时候啊,不给警告的时候呢,一般情况来说就是 底底层的啊,就是低级的给高级的,因为这样的话呢,他肯定是能完整的去表示出来的,就比如说我们一个 int 类型转成浪类型,那这个浪肯定是能完整的表示出这个 int 类型的, 所以说他的转换不会给我们相应的一个警告。那如果说咱们说什么说,哎,我能不能把浪行浪类型转成 int 类型啊?可以,但是的话呢,有可能会丢失数据,对不对?丢失数据的话,那么他就会给我们警告。那 隐式的类型的时候,隐式转换的时候,一般情况来说都是底转高, ok 吧?那么如果说咱们发生了这个高转低的时候,咱们一般情况来说不会用隐式的,而是考虑用这个强制类型转换,也就是第二种方式,这个咱们一定要清楚,好吧? 好,那么我们来看一个相应的代码啊,那么我们看一下,在这的话呢,我写了一些相应代码,这写着叫做 float pi 等于三点一四,那这个 float 类型我们想想它默认是什么?是一个 f 类型,但是想想如果说是一个浮点类型,咱们这个编辑器它默认会转成什么?是不是会转成一个 double 类型啊? 所以说咱们在这去复制的时候很有可能啊,注意这边的话呢,它再去参与计算,人家编辑器会转成一个 double 类型, 但转成 double 类型的话,然后在这儿去复制的时候,咱们这儿是什么呀?要左边类型,所以说什么呀?它内置的给我们做了一个转换, ok 吧?内置做了一个哎类型的一个转换。好,那么做完转换以后,然后我们再看 int 类型,这儿写什么? s r, 那 么它是什么呀?它是一个整数,这个肯定没问题, 然后在底下再进行预算的时候,你会发现什么?这是 r 乘 r, 然后 pi, 那 想想这时候这些数据类型它会怎么去做?它会把这个 r 转成什么呀?转成浮点类型。那么为什么转成浮点类型呢?因为你会发现这个 pi 是 不是就是浮点类型,所以说这边的话呢,都会转成浮点类型。 好,那么转成浮点类型以后,然后我们要还要再去考虑另一个规则,但凡是一个小数类型的就是浮点类型的,那么它最终会转成什么类型? 转成 double 类型,对不对?所以说他最后什么呀?转成了 w 类型, s 的 话呢?这边就是一个 w 类型, ok 吧?好,那么转成成 w 类型以后,然后我们在这去输出的时候,咱们说什么?哎,我要只要整数,所以说他最后给我们去输出的是一个整数,他也就说把小数呢给我们去舍弃掉了,是这样一个意思, ok 吧?好,那么也就说在这儿的话呢,它最后跟我们去输出的就是一个整数,因为它在赋值的时候,这儿就是一个什么呀? int 类型嘛,这是这个意思啊。好,那么这是这个演示类型相应的转换啊。

ok, 那 咱今天问题就是昨天没有解 决中,分别对应什么情况,这个你知道吗?不知道。好嘞,这个咱讲一下。首先呢, c 语言转换大体分为两类,第一类叫自动转换,第二类叫强力。这两个转换的用处其实 是系统的时间关单实现了一个转换,而强转的意思就是你需要通过手写代码的时间转换。 那自动转换在使用的时候呢,其实有两点需要注意点。首先呢,自动转不需要人为操作,它一般转换的时候是一般小数据向大数据之间转换。然后其次呢,在多转的时候你需要注意点,一般来说整数在预算的时候会被转为小数。 然后第二个就是说强转,强转这个呢它其实可以留在任何地方,但是在使用中需要注意两个问题,第一个问题呢,就是它可能发生这个颈椎丢失,第二个情况呢,它可能发生上下的情况,所以在使用的时候需要格外的注意。

辛辛苦苦用 c 语言写了一个列表,突然发现需求改了。之前列表保存的是 int 类型的数据,现在要改成 double 类型,那是不是要从头到尾修改代码?这个工作量确实太大, 于是聪明的你在写代码的时候稍微做了点改进,用 type define 把类型重新命名,这样后面不管是存储 int 还是 double, 只要修改成一个地方就行。恭喜你,你已经具备了泛型编程思想,懂得数据和算法的分离。 不过这种写法还是有点小儿科,实际用途不大。如果把类型换成非标准类型,比如结构体,这一套逻辑还得大改。 于是你又对代码做了改进,把数据直接改成 word 新类型的指征。这种指征在 c 语言里面俗称万能指征,它可以指向任意类型的数据,不管后面想要保存什么类型都不影响。 当然,对于链表的增删改查,一系列操作都跟之前有点区别。比如链表的插入操作,既要给节点分配空间,也要给具体的数据分配空间,赋值得改成 memory copy。 这样一套代码实用性就非常高了。 正当你沾沾自喜的时候,我不禁要给你泼一盆冷水,所以,一山还比一山高。 linux 内核还有性能更强的写法,轻入式链表。 他把链表的前后指征直接切入到用户的结构体中,这种设计最灵活,节点和用户数据完全结偶。我把这种实现方式尽量用最简洁的代码还原出来。首先是定义,链表结构只包含两个指征,一个指向前面的节点,一个指向后面的节点。 用户在定义节点的时候,直接把链表时针嵌入到结构体中,而对链表的初识化也是通过红来实现,虽然看起来有点乱,展开后就是这样的,不管是向前的时针还是向后的时针,都指向了节点本身。 列表的插入操作只涉及指征的移动,不涉及数据的拷贝。编辑列表的时候稍微有点复杂,这里的 list entry 通过成员的偏移量反推结构体的地址,然后再去访问结构体其他成员。有点类似内核里面的 intokenof 红函数, 代码不长,但是看起来确实有点复杂。聪明的你又突发奇想,既然想实现范型编程,那把 linux 内核换成 c 加不就行了?有了 s t l, 什么链表站队列,几行代码通通拿下。所以为什么 linux 内核不用 c 加来写?

今天我们来看一下 define, type define 和 ennum, 也就是红定义、类型定义以及美举类型,虽然都可以实现一键替换,但是萝卜白菜各有所爱,有的人挑食,有的人就不挑食。 先来看一下 define, 它的格式就是给要替换的文本起一个红名,比如将三点一四一五九二六起一个名字叫做 pi, 比如将这个表达式也起一个名字,实际上它是一个红函数,那么在程序当中,我们只需要使用它的红名就可以了。红定义它可以简化文本的书写,实现文本一键替换,它最主要的功能就是实现一键替换, 一键替换的规则就是无脑替换,就是什么都不要想,也就是照原样直接搬过来就可以了。这里要替换的是文本,也就是无论是数字、字符串、表达式还是红函数等等,都可以进行替换,也就是他不挑食,什么都可以。 比如定义一个 pi, 然后我们在后面写程序,写程序忽然想求圆的面积,那么圆的面积就是 pi 二的平方。定一个变量存储半径, 然后再定义一个变量存储面积,那么面积就是 pi 二的平方。这里使用到了一个红定义,那么在预处理阶段就进行无脑替换,也就是什么都不要想,直接搬过来就可以了, 其他部分保持不变,将 pad 替换成三点一四一五九二六就可以了。这就是 define 的 一键替换。首先它是不挑食的,什么都可以替换,然后在替换的时候,它是无脑替换的,就是什么都不要想,直接搬过来就可以了。 接着我们看一下 type define 的 格式,就是为原有的类型起一个别名,比如为阿萨那英类型起一个别名,这样看起来是不是书写比较简单了,但是它的主要功能还是实现类型的一键替换, 注意这里它比较挑食了,它只要类型,为什么要对类型实现一键替换呢?我们来看一下,这是 c 语言的基本类型, 按照类型的等级由低到高来划分。首先我们来看一下 c 语言对这些类型的规定,首先是 char 类型,必须占用一个字节, short 类型, int 类型、 long 类型,它们的大小是小,与等的关系 就是没有固定它们的大小。 float 和 double 的 类型大多数是四个字节和八个字节,由于类型的大小没有固定,那么在不同的单片机当中,类型的大小可能是不同的,比如这是八位机各个类型占用的字节数。 在三十二位单片机当中, int 类型占用的是四个字节,那么这里就不一样了。比如我们写一个八位单片机的程序,然后定义了一些变量, 这些变量都是 assign 类型的,也就是十六位。如果把这一段程序移动到三十二位单片机上面,那么在三十二位单片机里面, assign 类型是不是三十二位的?这个时候我们还想保持原来的十六位怎么办?是不是要一个一个进行修改? 我们再来看一下 type define, 定义类型,实现一键替换,这里为 r 三的 int 类型起一个别名, u 十六。那么我们在写程序的时候,定义几个变量 移动到三十二位单片机上面,那么 r 三的 int 类型是不是三十二位的,就不是十六位的?这个时候我们就要进行修改,一键替换就可以了,只需要修改这一个地方就可以了, 这里就是 type define 实现的类型的一键替换。我们再来补充一个点,看一下类型定义的特点, 比如定义两个变量用逗号分开,那么这两个变量是什么类型的? a 是 antony 类型的, b 也是 antony 类型的,就是这两个变量是同一个类型的。那么还有一个比较特别的地方, 比如再定义两个变量用逗号分开,那么这里的 p 一、 p 二是什么类型的? p 一 是指征类型, p 二就是整数类型。那有同学可能觉得有一点奇怪,怎么跟刚才不一样呢? 那么这就是一个规则,记住就好。所以我们在定义指征变量的时候,他的信号要放在哪里呢?是放在类型的旁边还是放在变量名的旁边? 一般我们在定义指向变量的时候,他的信号要放在变量名的旁边,这样就能时时提醒我们这样一个规则,就是他只定义了一个指向变量,而不是两个指向变量,不要把这个信号放在类型的旁边,因为我们会误认为这两个变量都是指向变量, 它们两个都可以实现一键替换,而且 define 它是不挑食的,什么都可以替换。对于类型也可以实现一键替换, type define 它就比较挑食,它只认类型。 比如 type define 可以 为指征类型起一个别名,实现一键替换, define 也可以为类型起一个别名,实现一键替换。那么既然都可以实现类型的一键替换,为什么还要有 type define 呢?我们来看一下, 比如这里定义了一个类型,然后我们写程序,写程序用这个类型定义两个变量,写完程序之后,我们来到预处理阶段,也就是进行无脑替换, 这个时候 p 一 是什么类型? p 二是什么类型? p 一 是不是一个指征类型? p 二是普通的整数类型。接着我们来看 type define 定义一个类型,再用这个类型定义两个变量,那么这里的 p 一 是什么类型? p 二 是一个指征类型, p 一 是一个指征类型。虽然都可以实现一键替换,但是 type define 定义的别名,它有类型属性 a define, 它只是进行一个无脑替换,它什么都不会想,只是照搬过来。虽然都可以实现类型的一键替换,但是我们给类型取别名的时候,还是使用 type define, 因为这个名称它会有类型属性。 type define, 它除了实现类型的一键替换,它还可以简化类型的书写,我们来看一下它是如何简化类型的书写。比如这里定义了一个结构体类型, 我们用这新的类型定义两个变量,那它的类型名是不是很长?烦死了。这个时候我们可以使用 type define 为这个类型起一个别名,那么这个时候就可以这样写, 是不是简化了类型的书写?这里的一大圈我们还可以合并在一起来写,也就是为这个类型起一个别名,首先是它还不 define 关键字,然后为什么类型起一个别名呢?为这个类型新的类型起一个别名 就可以用这个别名进行定义了,下面都是一样的。接着我们看一下每举类型,它主要是与常量有关系,这里列出了一些常量, 这里的常量可以直接写在程序当中,也可以用的方向进行定义,也可以使用每举常量,但是使用每举常量的时候,不能出现小数和字母串,每举常量,这个常量它只是一个整数。 然后我们来看一下美举类型,首先是一些基本的数据类型,然后是我们自己定义的新的类型,比如数组,结构体,美举还有共用体,他们都有一个什么样的特点。 用这个类型可以定义变量,定义变量之后,就在存储机当中会为他分配存储空间,他们和 define 和 type define 是 不一样的,这两个他是不占用存储单元的。 我们来看一下每举的格式,首先看一下结构体类型的格式,因为它们两个是差不多的,首先都是一个关键字,后面起一个名字,接着是定义一些成员, 这样就定义了一个新的类型,用这新的类型就可以去定义变量了, 每举类型也是一个关键字,加上每举名,接着定义一些成员, 注意这些成员他并不是用数据类型来定义的,那么这里就形成了一个新的类型,用这新的类型就可以定义一个变量。 等一会我们看一下他的成员特点,就是记住他的成员就是一个 int 类型,也就是一个整数,可以是负整数,零和正整数。 举一个例子,先生成一个美举类型,首先是一个关键字,然后后面是起一个名字,接着是定义成员星期一、星期二、星期三、星期四、星期五、星期六、星期天的缩写, 这个时候就形成了一个新的类型,用这新的类型定义一个变量,就像我们用基本类型定义一个变量是一样的,定义变量之后就会为他分配存储空间 给这个变量。负一个值,那么存储的就是零,为什么是零呢? 每局类型会自动为他的成员分配值,从零开始,然后依次加一往下,我们也可以修改他的值,比如第一个值修改成二十五,这个时候他的值就会发生变化,第一个值就是二十五,接着还是加一, 那么存储的就是二十五,中间成员的值我们也是可以修改的,那么这个时候的值又会发生改变,就是从负的九十九开始,下面还是加一 酶矩的成员,他的本质是引导类型,但是他只能读,我们也叫做酶矩常量。酶矩常量除了给酶矩变量赋值之外,他还可以像普通常量一样来使用。注意这里有两个概念,一个是酶矩常量,一个是酶矩变量,都可以用来使用。 我们再来看一下 develope 和美矩类型的区别。首先美矩它可以定义一个新的类型,用这新的类型就可以定义一个变量来使用它,还可以使用它的美矩常量, 也就是在程序当中,我们可以直接使用它的常量,也可以实现常量的一键替换。说到一键替换,那 define 它是不挑食的,什么都可以替换,常量也是可以替换的,而且它们俩定义的常量是百分之九十九通用的,那为什么还会有每举常量呢? 我们来举一个例子,看它们两个区别。用 type define 为每举类型起一个别名, 在眉影当中来使用,定义一个眉举类型,然后为这个眉举类型赋一个值,接着是 switch 语句,根据这个值执行不同的分支, 这里我们应该能够看懂,就是根据不同的值执行不同的分支,如果都没有的话就执行 default, 那 么这就是我们一个完整的程序。但是我们还是来看每举类型, 这里定义了几个常量,也可以使用 define 进行定义,它们的效果都是一样的,但是我们如果多定义了几个模式,是不是这样依次往下排? 我们刚开始这样计划很清晰,但是如果中间我们再插入几个模式,想把它放到一起,这个时候它的值如果按顺序应该是三,那么后面的值是不是都要修改,这样很麻烦,那么我们就改成九, 这样是没有问题,但是它的顺序就会有一些混乱,比如再插入一个,这个时候它的值我们就定义为十, 如果再插入一些,这个顺序是不是就会很乱?我们每次插入的时候还得找哪个数字用了哪个数字没有用,现在到哪里了,是不是很麻烦?这个时候就体现了每举类型的优势,就是如果有新添加, 它的数值是自动的依次往下排的,这个时候就不容易出乱,不容易出错。 define 它是不挑食的,它可以实现常量的一键替换,每举也可以使用每举常量,它们两是百分之九十九通用的,但是如果想使用一组有关联的整数常量,就用每举,如果是光杆司令,就建议使用 define 来定义常量。 最后我们来总结一下,先看这三个格式, 他们三个都可以实现一键替换,但是萝卜白菜各有所爱。比如 define, 他 要替换的是文本,也就是他是不挑食的,什么都可以,他还不 define, 他 只要类型。 呃,每组常量他要的是整数常量最好是一组相关的整数,然后用它定义放在一起。好了,这节课到此结束,拜拜。

没有什么是墙转解决不了的,如果有,那就再欠套一层。看到类型不兼容,首先想到的就是墙转,所以墙转才变成双刃剑。 对于老程序员来说,墙转真的是四两拨千斤,操作指征可以随心所欲,但是对于小白来说,墙转只能用来堵住兵器的嘴。 翻译过了,但是运行起来失控了,所以我总结了一下以下几种情况,不要轻易考虑,强转极其容易翻车。第一种,不同类型纸质之间的强转。这也是经常遇到的,比如这么一个代码,非要用 float 类型的纸质指向整形数据翻译,肯定是类型不兼容, 加上强转变异通过看起来完美,实则出现了未定义行为,这段代码就算跑起来失控的风险很高。第二种,对函数指征强转, 指征 p 指向的函数没有参数,没有返回值,非要用 i 的 来赋值,这也是类型不兼容。强转虽然变异能通过,但是涉及调用约定参数个数返回值,类型不匹配,崩溃的概率很高。第三种,不同的结构体指征之间的强转。 即使这两个结构体成员相同,但是布局可能不一样,访问错位,而且这也违反了严格别名规则。 第四种,整数和时针互转,时针的大小可能大于整数,强转就可能截断,数据都被改了,没有意义。还有哪些强转是危险的?如果你也深有体会,欢迎在评论区交流。

接下来我们来学习禁止表示与转换,这部分是理解不同的数字在 c 语言中怎么表示的基础。 首先我们来看二禁止,二禁止呢,它是由零和一来组成的,在 c 语言里面,它是由零 b 来开头的。就比如我们这个例子, 我们接下来呢,把这一串放到 print 函数里面进行输出,以百分之 d 的 格式进行输出,那其实就是输出十禁止,我们可以看到它的结果呢,是一个六,也就是说这一串二禁止的结果转换成十禁止,就是数字六了。 这里需要记忆的就是,我们一看到这个零币啊,就要知道它是二进之数。接着呢是八进之,八进之呢,是由零一直到七这八个数字组成的。 c 语言里面呢,是用这个零来开头表示八静止,那八静止呢,它是逢八进一,所以如果我们看到有一个零八三这样的数,它就肯定不是八静止了,因为我们的八静止里面是不存在这个数字八的,它只有零到七组成, 那出现了这个八变义器就会报错,那肯定就不是八静止了。然后呢,是我们的十静止,这是我们生活中常用的,它是由零到九组成的, 它不用特殊的开头,直接写数字就可以了。然后呢是我们的十六进制,十六进制呢,它是由零到九组成,那不够怎么办呢?它还会用 a 到 f 来组成, a 对 应的是十, b 对 应的是十一,这样以后以此类推, 我们的 f 呢,对应的是十五,它的开头呢是以零 x 开头的,就比如我们这个例子,后面的三 a 呢,就是它的数值,那这个 a 呢,它表示的就是十, 我们需要记住的是,只要看到了零 x, 我 们就要知道它是十六减值数。我们来看一道选择题,在 c 语言中,数字零 x 九九,它是一个什么? 我们可以看到选项说非法数八禁止十禁止十六禁止。我们知道零 x 呢,它表示的就是十六禁止,所以这道题我们的答案选择 d, 我 们需要记住每一种禁止它所代表的符号。 我们来看这道单选择题,下列哪一个禁止数表示不正确? 首先来看选项 a, 它是由零 x 表示的,我们知道零 x 呢,它就是十六进制,它是由数字零到九,还有字母 a 到 f, 小 写的也可以由这些组成的。我们可以看到一和六呢,它是在零到九之间的,所以选项 a 是 正确的。我们再来看选项 b, 他以零开头,我们就知道他是八进制,那八进制呢,就是由零到七组成的,那后面的一和六也是符合的,所以选项 b 是 正确的。我们再来看选项 c, 我 们看到这个零 b 呢,就知道他是一个二进制,二进制呢,就是由零和一组成,但我们发现他后面有一个二,所以选项 c 呢,他是错误的。我们再来看选项 d, 它是以 o x 开头的,所以它是一个十六进制,那这个小 a 确实在这个字母范围内,这个八也是在零到九之内,所以选项 d 是 正确的。这道题我们的答案选择 c。 接下来我们来学习怎么从二进之数转换成八进之数,我们这里呢,有一个二进之数,我们可以看到它都是由零或者是一组成的,非常的长, 那怎么去转换成八进制呢?它的方法就是首先以小数点为中心,我们找到这个小数点,把它分割开,然后呢每三位为一组,也就是说这个小数点后面以三位为一组, 这里也是三位一组。那前面呢,同样也是以三位一组,我们就可以看到圈起来的这个幺零幺写在这里,还有这个幺幺零也在这里, 那这个幺零幺是一组,这个幺零幺也是一组,那最后我们会发现他还剩了一个一,他没有三位啊,怎么办呢?我们说不足位就补零,也就是说我们这个一,我们在前面补两个零,也就是变成这个样子,那在这一行呢,就是把它分好了组。 那为什么我们不在一的后面补两个零呢?因为在一的后面补两个零,他就变成了一百,就改变了这个数值。但是我们如果在一个数的前面加两个零呢?他还是一,并没有改变他。 那接下来我们要做的就是按组替换,也就是说把每一组转换成他对应的八静止,比如说我们来替换这个幺零幺,这一组 幺零幺怎么把它转换成八进值呢?那首先我们可以写上它的权重,也就是二的零次方,二的一次方,二的二次方,如果后面还有数字,就是二的三次方。然后呢把它们相乘再相加,也就是对应的位置进行相乘 之后再相加。具体呢就是用这个一乘以它对应的二的零次方,再用这个零乘以它对应的二的一次方,再用这个一乘以它对应的二的二次方,算出来的结果就是一加上零加上四,也就是等于五了, 我们可以看到这一部分的值呢,转换成八进值就是五。我们再来看一下这个幺幺零, 那幺幺零这一组呢,我们同样也是先写它的权重,它的是二的零,二的一,二的二, 然后呢把它们相乘再相加,也就是零乘以二的零次方,加上一乘以二的一次方,加上一乘以二的二次方,那就会等于零加上二加上四,也就是等于六了, 我们这一部分转换成八进制就是六,那同样这里也是六,我们算的是正确的。那对于后面的这四组,幺幺零幺零幺幺零幺零零幺,我们也是以同样的方法把它转换成八进制,然后呢拼接在一起就是整个答案了。 再来看八进值数转换成二进值。我们之前从二进值转换成八进值呢,是以三位为一组,也就是进行组合,那现在我们是八进值转二进值,就要反过来了,就是要把这个组合进行拆解, 那他呢是把每一个数转换成三位的二进值数,也就是说把一个数转换成一个三位的二进值数。 我们来看这个例子,这个八净值数里面有一、二、三点二,一,一共有五个数字,那每一个数字呢,都要转换成他的二净值。 那首先我们可以看这个二,二转换成二净值呢,他就是零幺零一转换成二净值呢就是零零幺。再看前面这个三转换成二净值呢,就是零幺幺。 然后我们来看一下右边这里,它是进行了一个替换,以小数点为中心,我们这个呢是一个二,它对应的呢是零幺零,所以我们这里写上零幺零, 接下来呢是这个一一对应呢是零零一,所以在这里写了零零一。然后我们再往前看, 也就是这个三,他对应的是零幺幺,所以我们这里写上零幺幺,然后是这个数字二,他对应的是零幺零,所以写的是零幺零。再看最前面这个一呢,他对应的是零零一,所以我们把零零一写上, 这样呢我们就把每一个数字转换成了三位的二进制数。最后一步呢就是去掉无意义的零,我们一般呢是把前面的零去掉,也就是说把这两个零去掉,最后的结果就是这个样子了。 接下来我们来看二进制转十六进制,他的方法呢就是以小数点为中心,我们找到小数点进行分割, 然后是每四位为一组,我们前面学习的呢是每三位为一组,现在呢是每四位为一组。好,我们进行分组, 也就是这个幺幺零幺是一组,后面的零一是一组,但是他不满四位,我们就要补零,那怎么补呢?我们在他的后面进行补,也就是零幺零零,他就变成了这个样子,那前面也是四位,一组就是幺幺幺,零是一组, 零幺幺零是一组,然后这个幺幺是一组,我们还是要补两个零,我们在前面补,也就是零零幺幺。 接下来呢我们就按组进行替换,我们首先看这一组,它是零幺零零, 那我们的转换方式还是和前面一样,写上它的权重,二的零次方,二的一次方,二的二次方,二的三次方,然后让它们相乘,再相加,也就是说这个零乘以二的零次方,零乘以二的一次方,再用一乘以二的二次方, 零乘以二的三次方,那最后呢,这几个零都是无效的,我们只能得到这个一乘以二的二次方,它是等于四的,所以这一部分呢,转换后它就是四,我们可以看到答案,这里呢也是四。我们再来看一组这个幺幺零幺, 同样我们写上它的权重,二的零次方,二的一次方,二的二次方,二的三次方,然后让他们相乘再相加,也就是一乘以二的零次方,加上零乘以二的一次方,加上一乘以二的二次方,加上一乘以二的三次方, 算一下就是一加上零加上四加上八,结果呢就是十三。哎,这个十三,我们这个答案是 d 啊,我们并不能去写这个十三,我们记得吗?在十六进至里面,它是由零到九,然后呢是 a、 b、 c、 d、 e、 f 组成,这个 a 呢就是十,这个 b 呢是十一,这个 c 呢是十二,这个 d 呢是十三。哎,我们找到了这个十三,他对应的呢就是这个大地了,所以我们可以看到答案,这里呢是一个大地,那后面的这几组呢?同学们可以自行去写一下 他的答案,就是这个三六一。最后我们来看一下十六进至转二进至,在前面呢,我们是一组,那现在呢,我们要开始拆分了,那就是把每一个数拆成四位的二进至数。 我们来看这个例子啊,这里呢有二 c 一, 还有大地,我们先看这个大地,把它拆成二进之数呢,我们知道大地它表示的是十三,然后把十三转换成二进之数,就是幺幺零幺, 然后再是这个一,这个一转换成四位的二进值数就是零零零幺,这个 c 呢,我们知道它表示的是十二,那它转换成二进值呢,就是幺幺零零,最后就是这个二了,它转换成二进值呢就是零零幺零, 然后我们把它拼接起来就可以,也就是说把这些二进制拼接在一起,就变成了这个结果,那我们要去掉无意义的零,也就是说前面这两个零呢,可以去掉。 我们来看这道填空题,把这个转换成实进制为多少? 首先呢,我们在小数点的地方给他分割开来,然后我们先看左边写上他的权重,也就是二的零次方,二的一次方,二的二次方,那右边呢,他就会有负的,也就是说二的负一次方,二的负二次方,二的负三次方。 接下来呢,我们让他的每一个数乘上自己的权重,然后之后相加,也就是一乘以二的负三次方, 然后是零乘以二的负二次方,一乘以二的负一次方,依次类推,把前面的三个也进行相乘,最后呢把它们进行相加,就是这样了。那最后我们算出来的结果呢,就是五点六二五,这道题,我们的答案写五点六二五。 接下来我们来学习机器数,简单来说呢,机器数就是计算机里面存的数,有正负号,也有没有正负号的,那都是用二进制编码来存在的。 我们可以从图中看到,机器数呢分为有符号数和无符号数,那有符号数里面又有圆码、反码、补码这几种表示方式。 我们先来了解一个知识点,就是计算机内存储器的最小单位,叫做位,也叫做 byte。 那 每一位呢,只能够容纳零或者是一,这是二进置存储的基础,因为二进置呢,只有这两个状态, 一个字节呢,它会等于八位。我们这里的例子呢,都是用八位来表示的,那什么是圆满呢? 圆满的规则就是用最高位来作为我们的符号位,零表示正数,一表示负数,剩下的位表示数值的绝对值。我们可以看这个例子,有一个 x 呢等于正六, 我们知道六转换成二,减值呢就是幺幺零。然后我们需要写成八位,所以我们在前面呢补了五个零, 那我们这个地方呢,是用零来表示,因为它是一个正数,所以我们第一位呢是写零。当这个 x 变成负六的时候,我们的第一位呢就把它写成一,这样就可以表示负数,然后后面的位置呢都是一样的。 我们再来看这一行,我们发现这一行和上一行是一样的,那这里我想说明的就是同一个负数,它的原码呀是固定的。 这里呢有一个特别的数,就是零了,那零的圆满,他有正零的圆满和负零的圆满。我们可以看到数值的地方呢,都是零,他们是一样的,只不过符号位的地方,正零的这里呢是一个零,负零的这里呢是一个一, 有这两种表示方式。然后我们来看一下八位二进至元码的表示范围,我们知道一个字节呢等于八位,那第一位呢,它是符号位,存住我们的零或者是一, 后面还剩七位。那每一个位置呢,他可能存零,也可能存一,所以他有两种可能,这里也是两种可能,这里也是两种可能,那把它们乘起来就是所有的可能性了,也就是二的七次方。 这里需要注意的是,我们这里呢有一个正零和负零,但他们都是同一个值,也就是零,所以他要减去一种,实际上我们只有二的七次方,减一种存储, 他算出来的结果呢,就是一百二十七了,所以他可以表示从零一直到一百二十七,那表示负数呢,就是负的一百二十七到零,这就是八位二进制原码表示的范围。 接下来我们来看反码,什么是反码呢?反码的规则很明确,正数的反码呢是一样的,那负数的反码呢,就是进行符号位不变,其他取反的操作。 我们来看这个例子,有一个正四,我们把它转换成二进制呢,就是这样的。那第一位呢就是符号位,因为他是正数,所以我们这里呢写的是零,然后正数的反码呢,和原码相同,所以我们直接把这一串抄过来就可以了。 那当这个值变成了负四,那我们这个地方呢,就把它写成一,就是负四了。那复数的反码呢,要进行符号位不变,其他取反。我们求反码的时候,这个符号位保持不变,依然是一, 其他取反。那就是说后面的部分,如果是零,我们就换成一,如果是一,我们就换成零。我们可以看到这里呢有四个零,那他就变成了四个一,这里是一,这里就变成了零,后面有两个零,我们就换成了一一, 这就是我们计算反马的规则了。最后我们来看补马,补马呢,它的规则就是正数的补马和原马是相同的,负数的补马是反马加一, 那正数的补马呢很简单,就是它的原马我们就不说了,我们来看一下负数的补马,就看我们这个例子,有一个负四,然后把它写成二进制呢,就是这个样子的, 那他的方法呢,就是让我们先求出他的反码,然后再加一,所以我们求复式的反码呢,我们说反码就是符号位不变,其他取反, 所以我们可以看到这个一呢他是没有改变的,然后其他位取反,我们可以看到这里的零变成了一,一变成了零,所以最后的结果就是这样,这就是他的反码了。接下来最后一步呢,就是要进行加一,怎么加呢?我们来看一下, 我们把繁码写到了这里,然后进行加一,我们看到首先一和一相加之后就是二,然后逢二进一,所以他会进一位,那这里的一和这里的一相加又是二,逢二进一,他又会进一位,那这里的零和一就变成了一了。然后前面的呢我们可以直接写下来, 最后这个呢就是我们的结果了,我们可以看到负四的补码和我们算的结果呢是一样的。我们来看这道填空题,已知八位二进制机器数的原码是这个,它的反码和补码是什么? 我们来观察一下这个元码,我们发现它的第一位呢是一,我们说一表示的就是负数,所以这个数呢是一个负数,我们需要求这个负数的反码和它的补码。我们回忆一下,负数的反码呢,就是符号位不变,数值部分取反, 那补码呢就等于他的反码加一,现在我们来计算一下他的反码,也就是说符号位不变,其他的取反,我们把这个零呢换成一,把这个一呢换成零,然后换成一零零一一, 这个呢就是他的反码了,和我们这个答案呢是一样的。接下来我们再来求他的补码,补码呢就是在反码的基础上加一就可以了, 那一加一他就是二逢二进一,所以呢他就会进一位,这里的一加上这里的一呢也是二,继续逢二进一,然后进一位,这里的一和零相加就是一,后面呢我们就可以抄下来, 这个呢就是我们的补满了,和我们的答案是一样的,所以我们这道题的答案就是这里和这个。 最后是根据这节课重点知识整理的课后习题,同学们可以截图保存,课后进行练习,巩固这节课的内容到此结束。

学习 c 语言最怕的是什么?我觉得不是指征,而是那些复杂的类型。声明,通过一个简单的案例,看看一个普通变量是如何一步一步变成了你不认识的样子。 首先定一个指向整数的指征, int 新 p, 这个太简单了,学过指征的都会。然后稍微升级一下指向整形数组的指征代码可以写成这样,因为有括号的存在。变量 p 还是指征指向数组,数组有五个元素,每个元素都是整数, 到了这一步应该还行,大部分同学都能看懂,而且开发中也经常使用。再次,升级,指向整形指征数组的指征区别主要在数组,之前是整形数组,现在是整形整数组, 所以只需要在前面加个星号,表示数组里面的元素都是 int 星。这样的表达式可能不少人看了会晕。 第三次升级,指向函数指征数组的指征区别还是在数组,原来的数组保存的是整形指征,现在保存的是函数指征,这次需要大改, 改成这样,屁,是个指征指向数组,数组五个元素,每个元素都是指征指向函数,函数没有参数,函数返回整数。说白了,这么复杂的操作只是为了定一个指征,但是看起来真的晦涩难懂, 好像也只有 c 元才有这么逆天的嵌套写法,直接劝退了不少人。如果想再定一个相同类型的整数 p e, 又得写这么长的一段代码, 那有没有什么技术能把变量的类型交给编辑器来判断?有的学过 c 加的同学一定知道,关键字 auto 就是 这个在 c 元中基本被遗忘的关键字,直接写成 auto, p e 等于 p 就 行。至于 p e 是 什么类型,让编辑器自己去推理好了。 好消息是,就在最新的 c 二三标准里面, auto 也具备了类型推理的功能。只要你的 c 源翻译器足够新,这行代码直接就能翻译通过, auto 再也不是最没用的关键字。 另外还有一个新增关键字 type of, 它的作用就是可以获取表达式的类型,以前是 g c c 的 扩展功能,四二三标准被正式纳入关键字,比如定义指向 p, 直接用 type of 先推断出 p 的 类型,然后用这个类型再定义新的变量 p, 确实也很方便。

大家好,今天我将为大家带来关于单片机 c 语言的数据类型解析的分享。在单片机开发中,数据类型的选择和使用直接关系到程序的效率、内存占用和稳定性。 本次分享将从基础的数据类型开始,逐步深入到构造类型、指征和媒举,并结合实际案例进行分析,希望能帮助大家更好地理解和应用 c 语言的数据类型。本次分享将分为五个部分。 首先,我们将通过引言部分了解数据类型在单片机开发中的重要性。接着,在基础篇中,我们会详细解析 c 语言的基本数据类型。 然后,在进阶篇和高级篇中,我们将探讨构造类型、指征、媒局等更复杂的数据类型。 最后,在总结与展望部分,我们将回顾本次分享的重点,并给出一些高效编程的建议。在单片机开发中,数据类型的选择事关重要。 首先,单片机的内存资源非常有限,选择合适的数据类型可以最大限度地节省内存空间。 其次,不同的数据类型在运算速度上也存在差异,选择高效的数据类型可以提高程序的运行效率。此外,正确的数据类型选择还可以避免数据溢出和类型错误,保证程序的准确性和安全性。 最后,清晰的数据类型定义可以提高代码的可读性和可维护性,方便团队协助和后续的代码修改。 c 语言提供了丰富的基本数据类型,用于存储不同类型的数据。 这个表格列出了最常用的几种基本数据类型,包括它们的关键字、大小、取值范围和简要描述。 例如,叉类型通常用于存储单个字体,占用一个字节。 int 类型是最常用的整数类型, 占用四个字节。 float 和 double 类型用于存储小数,分别提供了单精度和双精度的浮点运算能力。在实际开发中,我们需要根据数据的范围和精度要求来选择合适的数据类型。 接下来,我们详细了解一下整形数据类型差 shorthand 是 最常用的三种整形, 它们的大小分别是一、二和四个字节。在计算机中,整数通常以补码的形式存储,这可以简化复数的运算。需要特别注意的是 sent 和 n sent 的 关键字,它们决定了变量是否可以存储复数。例如, snd chart 的 取值范围是负一百二十八到一百二十七,而 nnd chart 的 取值范围是零到两百五十五。在定义变量时,我们应该根据实际需求来选择合适的类型和符号属性。 当需要存储的整数超出了 int 类型的范围时,我们可以使用 long 或 long long 类型。 long 类型通常占用四个字节,而 long long 类型占用八个字节,可以存储非常大的整数。 对于小数,我们使用 float 和 double 类型,它们采用 i 一 一七五四标准进行存储,由符号位、指数位和尾数位三部分组成。 float 类型的精度约为六到七位有效数字, double 类型的精度约为十五到十七位有效数字。在进行浮点运算时,需要注意精度损失的问题,避免直接比较两个浮点数是否相等。数组是一种非常重要的构造数据类型,它可以将一组相同类型的数据组织在一起。 数组中的元素在内存中是连续存储的,这使得我们可以通过下标快速访问任意元素。在 c 语言中,数组的下标从零开始,我们需要特别注意避免下标越界的问题, 这可能会导致程序崩溃或数据损坏。这个代码示意了一维数组和二维数组的定义。 初识化和便利方法。通过循环,我们可以方便地处理数组中的所有元素。结构体是一种非常灵活的构造数据类型,它允许我们将不同类型的数据组合在一起, 形成一个新的类型。例如,我们可以定义一个 student 结构体,包含学生的姓名、年龄和成绩等信息。 结构体的成员变量在内存中是顺序存储的,但为了提高访问效率,翻译器可能会进行内存对齐, 在成员之间插入填充字节。我们可以使用点操作符来访问结构体的成员变量。结构体在实际开发中非常常用,特别是在处理复杂数据时。 共用体与结构体类似,但有一个重要的区别,共用体的所有成员共享同一块内存空间。 这意味着共用体的大小等于其最大成员的大小,并且在同一时间只能存储一个成员的值。当我们给一个成员赋值时,其他成员的值会被覆盖。共用体的这个特性使得它非常适合用于数据解析。 例如,我们可以将一个三十二位的整数解析成四个八位的字节。在这个代码示意中,我们展示了共用体的基本用法和数据解析的技巧,指真是 c 语言中非常强大的一个特性,也是学习的难点之一。 指真变量存储的不是数据本身,而是数据在内存中的地址。通过指真,我们可以间接的访问和修改变量的值。指真的大小取决于系统的位数,在三十二位系统中是四个字节,在六十四位系统中是八个字节。 指针还可以进行熨算,例如指针与整数的加减熨算,这在处理数组时非常有用。这个代码示意展示了指针的基本定义, 负值和访问方法。指针在数组和字母串的操作中有着广泛的应用,实际上,数组民可以看作是一个指向数组首元素的常量指针,我们可以利用这一点来使用指针便利数组。 字母串在 c 语言中是以零分结尾的字母数组,我们也可以使用字母指真来方便地操作字母串。这个代码示意展示了如何使用指真来便利数组和字母串。通过指真的移动, 我们可以逐个访问数组元素或字母串中的字母。掌握指真的。这些用法可以让我们的代码更加灵活和高效。指真作为函数参数时可以实现非常强大的功能。 首先,通过传递变量的地址函数可以直接修改时参的值,这就是所谓的传址调用。其次,当需要传递大型数据结构,如数组或结构体时,传递指针可以避免数据的拷贝, 大大提高程序的运行效率。在这个代码示意中,我们展示了如何使用时针来交换两个整数的值,计算数组元素的和以及修改结构体的成员。 掌握这些用法可以让我们编写更加高效和灵活的函数。每举类型允许我们定义一组具有名字的长量,这可以大大提高代码的可读性和可维护性。例如,我们可以定义一个 weekday, 每举来表示一周的七天。 或者定义一个 car, 每举来表示不同的颜色。每举的底层实际上是整形。每个每举长量都对应一个整数值 默认从零开始递增。我们也可以显示地为每举常量指定值。每举类型在处理状态码、选项等场景时非常有用。 type def 关键字可以为已有的数据类型定义一个新的名字,这在处理复杂类型时非常有用。例如,我们可以为结构体定义一个别名, 这样在定义结构体变量时就不需要每次都写 struct 关键字。我们也可以为指真类型,特别是函数。指真类型定义别名,这可以让函数指真的声明更加清晰易读。 type def 并不会创建新的数据类型,它只是为现有类型提供了一个新的名称。合理使用 type def 可以 提高代码的可读性和可维护性。为了更好地理解数据类型的综合运用,我们来看一个实际的案例。 假设我们需要设计一个传感器数据采集和处理程序,需要存储传感器的 id、 类型、采集时间和测量值等信息。 在这个案例中,我们使用每举类型来定义传感器的类型,使用结构体来存储时间信息和传感器数据。使用数组来存储多个传感器的数据,并且使用指真来便利数组打印出每个传感器的数据。 这个案例综合运用了我们前面介绍的多种数据类型和使用数据类型。 通过本次分享,我们回顾了 c 语言中各种数据类型的特点和用法,从基本的整型、浮点型 到复杂的构造类型,指真和美举数据类型是 c 语言的基础。选择合适的数据类型对于编辑高效稳定的程序直观重要。 在实际开发中,我们应该根据具体的需求,综合考虑内存占用、运算效率和数据精度等因素来选择最合适的数据类型。我们也要不断学习和实践,不断提升自己的编程水平。

大家好,咱们这节视频呢,给大家介绍一下类型转换哈,类型转换呢,就是将一个数据转换成另外一种类型呢进行使用啊,什么意思呢?咱们前面也多次涉及到过哈, 比如说给我们一个整形变量 a 呢,复制上了一个浮点型的一点二,对吧?那么这个浮点型呢?呃,它是不能够直接复制给我们这个整形的啊,比如我们 a 呢,是 int 类型的,它是不能直接复制的,而是什么要把这个浮点型呢转换成 int 类型,然后呢再复制给我这个变量 a, 那么他这个转换怎么去转换呢?哎,就是将我们的这个小数点呢直接卡掉,哎,只留整数部分,整数部分呢就是他最终的结果复制给我们这个变量 a 了,对吧?哎,那么这个过程是什么呢?就是,哎, 转就叫做类型转换啊,把这个类型呢转成别的类型进行使用了哈,这个类型转换呢分两种啊,一种叫做隐式类型转换,一种叫做显示类型转换。 影视类型转换呢,顾名思义就是隐藏着偷着给我们做的,也就是 c 语言呢,它本身规定了一些,呃,类型啊,就是说不同类型在预算的时候呢, c 语言规定了说,哎,这种东西呢,我们这个编辑器呢要帮助程序员进行转换,那么还有还有一类的这个呃数据的转换呢,它是无法进行这个, 哎,影视类型转换的,必须由我们程序员呢进行这个强制类型转换,也就是显示类型转换。那么这是什么样的数据呢?比如说我们的呃结构体,想要把结构体转换成一个整形去使用,哎,那怎么着啊, 那么这个系统呢,是没有办法帮我们去转换的,因为呢,我们这个结构体呢是自定义的,谁也不知道这结构结构体里装的是什么,只有我们程序员去知道,所以说呢,这个计算机就没有办法将这个结构体呢强制就是隐隐形的隐偷偷的帮我们去转换 啊,他不能做这个无名英雄了,那那种呢,就叫做强制类型转换,或者显示类型转换,就是我们自己去写的。那么这个 c 语言允许的这些隐式类型转换呢,在哪基本呢?就是我们的基本数据类型, 哎,比如说 int 类型, float 类型,就像我们刚才举的例子,给一个整形呢复制了一个浮点型,那么这个浮点型呢,就会隐式的转换成这个整形,再复制给我们这个变量 a, 对 吧?哎,这就是隐式类型转换 c 语言的编辑器呢,帮我们默默做的啊,当然的话呢, 这个影视类型转换他的情况呢比较多,我们在呃实际应用的时候呢,哎,有一些影视类型转换吧, 呃,大家呢,可以给他写成显示的类型转换,对吧?就是,呃,本来计算机可以帮我们做的,但是我们自己呢抢自己呢去做一下可以吧,没有任何问题的,他最终的目的呢,就是把这个数据呢给他转换一下,不管是引转还是显转,他都是转,所以说呢, 哎,在我们一些应用的时候呢,可能这个显示类型转换呢,我们写的会多一些,目的呢,就是自己也清楚别人看我们的代码呢,也清楚这块的问题,对吧?不然的话,有些小伙子对这个影视类型转换呢,他 知道的太少,那么这块呢,涉及到这个转换了,哎,可能出现一点点问题,哎,他就没法去调试,出问题直接找不着点,对吧?所以说我们显示类型呢,可能写的要多一些啊,当然这是编程经验来说啊。 好,那咱们呢,先看我们这个引式类型转换啊,引式类型转换呢,首先情况一,这块有多多个情况,先看第一种情况,第一种情况呢就是赋值转换啊,赋值转换,这赋值转换呢,也是我们刚才给大家简单说的那个,比如说给这个变量 a 呢,就赋值了一个一点二,对吧? 哎,那么这个过程中呢,当然 a 是 int 类型的,这个过程呢,就是引式类型转换啊,这是编辑器帮我们呢,可以为我们转呢,哎,这是因为呀, c 语言规定的, 哎, c 语言呢,设置了这个规定,然后编辑器厂商呢,按照这个 iso 的 这个标准,然后呢去设计编辑器,所以呢,哎,你标准的 c 语言这个编辑器呢,你就要支持这个东西,对吧? 要支持这个东西,当然很多非常细节的东西呢,这个不同的编辑厂商呢,支持的程度也是不一样,但是他们支持的大体的那个效果呢,都是一样的啊。好,我们看第一个赋值转换啊,赋值的这个转 转换,这个转换呢,也有多种情况,其实这些情况呢,我们都比较清楚啊,第一个就是初入化,初入化的话呢,就将赋值计算符左侧呢为我们目标类型,对吧?哎,就像我们初入化的时候,定个变量 a, 给它复制了一个,哎,浮点型, 对吧?那左侧呢是目标类型,什么意思呢?哎,就是我要把这个数据去装到我这个变量 a 里头,对吧? a 呢是一个仓库,它是不变的,哎,你这个数据跟我们这个仓库不匹配,哎,你就要把这个数据修理修理修理好了呢,再装到我们这个呃仓库里头,对吧?所以说左侧的这个是我们的目标类型,也就是呢,要将这个十二点六它的 double 类型呢转换成整形,然后呢再复制到 a 里边。这回给大家写的这个过程呢, 将 double 的 十二点三转换成 int 的 十二啊,十二点三的话呢,就直接卡掉了。 将十二呢复制给我们这个变量 a, 这是它的过程啊,那么下面呢是数组,数组也是同理的,对吧?我们数组的元素呢,它就相当于一个变量嘛,对吧?抽象化的时候呢,就是把这个数据呢抽象化给具体的元素,每个元素都是 short 类型的, 对不对?哎,那你这个转换的时候,哎,就把就复制抽象的时候呢,哎,第一个元素的话,就把这个三点四 f 呢复制给第一个元素,但是我第一个元素是少的,然后你这个是赋点型,哎,他把这个赋点型这个转换成少的类型,对吧?少的类型的三,然后呢复制给第一个元素,那第一个元素里边装的就是三了, 哎,这就是,呃,第一个叫做抽象的这样的一个复制转换哈,然后第二种第二种就是纯的复制转换了哈,就是说在这种情况下呢,就因为他在抽象吗?所以说,呃,这个资料上呢就给他单独列出来了, 下面这种呢是赋值,对吧?他叫赋值语句,所以说呢,又把这个赋值单独列出来了,其实他俩的这个意义呢是一模一样的,就是将右侧呢转换成左侧的这个类型,然后呢再赋值,对吧?哎,这两种其实是一样的啊,只不过他俩的语义不一样,所以呢 给单独列出来了。第三种呢就是我们这个函数的时残会被转换成形残的类型。哎,我们一直讲这个函数的时候就说啊,我们这个函数调用的时候呢,就是我们这个呃时残给形残进行抽象的过程,对吧?那就相当于 int a, 哎,这个行餐局部变量嘛,出水化个三点四,对吧?然后呢 double b, 哎,出水化了一个五,对吧?哎,整形的五复制给 double b, 然后呢是三点四啊, w 型的三点四呢复制给 a, 哎,这是我们时餐啊传递给行餐的这么一个本质的过程,是出水化, 所以说这个过程呢,跟我们上面第一个呢是一模一样的,对吧?啊,然后第一个呢就三点四,要转换成 int 类型的,剩个三,然后复制给 a, 那 所以说 a 的 值呢,就是就是三。后面这个 b 的 话呢,是要把五五呢是整形的哎,它要转换成 w 类型的五点零,然后呢复制给我这个啊,出水花给我的这个 b 这个变量, 哎,这是啊这个过程,然后紧接着,呃是函数的返回值呢,会被转换成返回值的类型,那什么意思啊?那就是我们返回值假设我这个下面呢举着例子呢啊, 举着例子,比如说我这个函数,我这个函数的返回值呢是 int 类型的,然后呢你返回的 return 的 值呢?是什么?是十二点六,对吧?我们要把这个十二点六呢通过 int 呢返回出去,所以说呢,我们要把这个十二点六这个 double 类型呢转换成 int 类型的, 对吧?哎,那么我们这个返回值这块呢,本质是什么呢?哎,叫做临时变量啊,定一个临时变量就相当于这块呢,返回值这块呢,定一个临时变量 a, 哎,这块有个临时变量 a, 这个 a 呢只在我们返回值这块作用以下,所以它是临时的,哎,就当那用一下明白吧。 好,假设呢,这块有这个变量 a, 那 么 return 的 作用呢?就是将这个十二点六呢复制给我这个变量 a 啊,这个叫 b 吧,叫 b 吧啊, 变量 b, 然后的话十二点六复制给他,那么十二点六的话呢,是 w 类型,哎,要把这个 w 类型呢转换成整形的 int 类型的十二,然后呢复制给我这个 b, 所以 说这个 b 这个临时变量里边装的就是十二,然后在我们函数啊调用这一块呢, 函数调用这一块呢,那么就是将这个函数的返回值呢复制给谁啊?复制给我这个 a, 那 返回值是个临时变量 b, b 里装的十二,所以呢将这个十二呢又复制给 a, 所以 说外边接入这个 a 呢,结果是多少啊? 哎,是我们十二点零了,对吧?而且这个十这个十二呢是 int 类型的吗?它要转换成 w 类型的,然后呢再复制过去,它这块接着的是多少啊?就成十二点零了,按照我们后面这个六在哪在哪舍掉的呀?哎,就是在我们这个返回之中中间这一块,这块临时变量,这一块呢,给它舍掉的, 明白吧?哎,所以说 return 到我们 int 这个过程呢,它有一个临时的这么一个 int 类型的变量啊,当然的话,这不一定是 int, 你 这块如果是 short, 那 就是 short 类型的,你这块呢,是 float, 它就是 float 类型的,明白吧?哎,这是 我们这个函数返回值的啊,这样的一个转换,所以说这个这种情,这四种情况下吧,他的本质呢,都是赋值转换,对吧?哎,他都涉及到了赋值这个东西,所以呢,哎,这个四种小的情况吧,叫做赋值转换。当然的话呢,你在这个写程序时候可能还有一些非常极限,非常特殊的这个赋值情况,哎,那都都 它呢,只要是负值的这块呢,都遵循着相通的啊,这样的一个呃,转换的,转换的这个这叫逻辑,就是呢,把右侧的呃操作数呢,转换成我左侧的这个变量的类型啊。

大家好,咱们这节视频呢,继续看我们这个强制类型转换哈,那么第二种情况,时针的类型呢?是大时针呢,不要操作小空间,什么意思呢?比如说我这个有一个空间呢,是 a 啊,这个 a 的 空间呢,是四个字节, 然后我用一个浪浪类型的纸质呢,这个浪浪是八字节的,对吧?用这个浪浪类型的纸质呢,就指向了这个小空间,它的指向是没有任何问题的,因为这个 p 呢,可以装,任何类型的纸质它都能装,但是呢,它能不能操作呢?那就不一定了,对吧?好,那么下面这步操作呢,就会出现异常, 呃,什么问题呢?因为我 a 这块空间呢,只有四个字节,对吧?而我浪浪这个纸真呢哎,他一次操作八字节的空间,这也是我们在前面讲纸的时候给大家介绍过,对吧?包括这个情况呢,咱们也说过,就是我们这个呃,纸真呢,他一次操作多少字节的空间,那么这个操作的这一个单元呢, 就是由他的类型决定的,对吧?浪浪是一次操作八字节,那么你用这个星 p 去操作,我指向这块空间呢,哎,就是操作你这块空间四字节之外,又额外的操作了四字节。哎,那么把这个四十五呢,转成这个六十四位的二进制,哎,这个六十四位的二进制呢,就装在这六十四位的空间里边,对吧? 哎,那这样的话呢,就有四个,这个四个字节呢,是,这叫越界了,对吧?这叫越界了,就像我们数组越界一样,是一个基本的道理。然后这块呢操作就异常了哈,咱们给大家演示一下, 哎,这呢, 这是我们一直强调的哈,就是指真呢,你这个东西你不管怎么操作啊,一定不要越界,你可以少用一块空间,但是万万呢不能多用空间啊,哎,比如说这块重新复制了哈,咱们编一下 好,它这块呢,就已经提示这个类型不兼容了,对吧?像这种指真的警告呢,我们一定要去解决了它,因为指这个东西非常的啊,容易出问题啊, 我们点击继续点击之后发现什么?哎,发现了,出现了这个异常了,对吧?已引发异常。而什么呢?是 stack around the value a was 这个东西什么意思?就是这个 a 这个变量呢附近呢使用越界了, 对吧?但是他这个越界这个异常呢,在哪报的呢?我们看一下啊,这个报的位置也非常的啊,有意思啊,他呢,看我们正常呢,运行到呃程序的最后一个大括号的时候呢,没有出问题,对吧?也就是我们这个呃程序呢,运行完了没有问题,什么时候出问题了?哎,在我们程序结束的时候出了问题, 对吧?哎,像这种问题呢是非常严重的,因为呢他出现的这个这个这个越界呀,在我们程序的运行过程当中呢,没有产生异常的中断, 对吧?所以说他在运行当中产生的问题呢,是不可知的,不可预知的,哎,就让咱们前面说的,因为你越界了,哎,我们这个程序里边可能定义了很多的变量, 是不是定义五十个变量,哎,那么这些空间呢,基本都是连续的在这定义的,对吧?当然不一定是非常连续啊,但是说他定义在哪个位置呢?他大概是有一定规律的, 哎,那么也或者说呢,就是一个挨一个定义的吧。哎,那么你前面这个变量使用越界了,很有可能呢,就把人家后边这个变量的空间的一部分给改了, 对吧?你把人家这个数据改了,那么我这个变量 b 呢,他在使用的时候呢,数据就不对了,是不是他数据出问题,那他又引发的问题呢?我们又不可预知了,所以说这个越界呢 引发的问题呢?是啊,不可预知的,哎,可能会造成非常严重的后果,也有可能呢,没有产生什么异常严重的后果,明白吧?所以说这个问题呢 啊,我们就知道了,这是越界了,对吧?这是这个问题哈,然后紧接着我们看第二种情况,这就不必多说了哈,大家呢,这个 他就这些基本道理呢,太简单了啊,没有比这更简单的啊。好,那么我们这个小指针呢,是可以操作大空间的哎,比如说我定一个浪浪的空间,这个空间呢是八字节的,对吧?我定一个硬的型的指针呢,去指向这块空间,这个指向呢是没有任何问题的哈,你可以指向任何东西, 对吧?任何的地址他都能指,但是操作的时候能不能呢?哎,我这个呢就是能操作的,因为我这个 p 呢是 int 的,是吧? int 呢,一次操作四字节的空间,而我这个 a 呢是八字节的,对吧?哎,他八字节这么多哎,有两个四字节,那我这个 p 呢,是指向他的手地址的, 那我用这个 p 去操作的时候呢?哎,他就操作的是,哎,前面这个四字结,对吧?后边还有四字结呢,哎,他怎么着他就没去操作,所以说没有越界,只要没有越界就不会产生这个异常中断的这种事情,但是呢, 哎,那你这个操作也会出现一定的问题,什么问题呢?比如说我这个 a 是 四,对吧?然后呢,你用这个星 p 去复制这个四的时候呢,就不是四, 对吧?哎,就是我们这个 a 这个边调里边,你你通过他去复制一个数据,但他里边最终装的不是那个数据,这样的话呢,就 啊就就不对劲了,对吧?可能就会产生问题了哈,毕竟呢,你你你才操作人家一半的空间,对吧?你后面那一半操作不到呢,而使用这个 a 的 时候呢,他使用的是整个八字节,对吧?而你这个星 p 呢,只操作了人四字节, 那可能就会产生问题,对吧?但是呢,他不会产生这种越界非常严重的这个事,是不是?哎,他呢会造成可能一些逻辑上的错误啊?这个呢,大家也能够去预想的到,那么我操作前面的四字节,我可以操作后边的四字节吧,也可以啊,因为 p 呢是指向这个手四字节手一指的,那我 p 加一 是不是就第二个四字节的手地址了,哎, p 呢就指向这儿了,就把它完成,当完全当成我们数据库的那种去使用了一个 int 类型的数组,只不过这个 int 类型数组呢,是两个字节的,对不对?哎,所以说这个星 p 加一呢,就是我们后面这个四字节了, 哎,这是,呃,或者说我们也可以转换嘛,对吧?转换成这个 p 方括号零,这个下标计算 p 零 p 一, 哎,这就是两个四字结,哎,那么这两个四字结呢,操作都没有问题啊,那你说 p 二的时候呢?哎,那就出问题了,对吧?那 p 二呢?是这一块空间了越界了啊,这就是我们的这个情况啊,那么我们可以把这个东西呢简单给大家演示一下啊,当然的话,你不仅可以指向这个,是吧?比如浪浪 a 等于十二吧,然后我这个这个这个印的星, 哎,写上。那么平时大家如果说是你的编辑报错了的话呢,你就把这个墙转写上啊,写上这个印的星, 对吧?把这个墙转给他写上啊,这样的话呢就不报错了。所以有的编辑可能会报错啊,有的呢不报错这个呢也没有事啊,你这个最好呢给他写上啊墙转, 然后紧接着呢,我们就星 p 或者说直接 p 方括号零,对吧?然后紧接着呢我们就星 p 或者是一个三,对吧?然后第二个四字结, 我们给它复制一个六,哎,可以吧,没有问题,对吧?然后我们如何去看我们这个数,这个这个呃 数值的一个结果呢?我们使用这个十六进值形式啊进行看啊, l l x, 然后呢输出一下我们这个 a 的 值,这样我们看一下它的十六进值啊,包括呢我也可以呢,去先看一下我的这个原值,对吧?然后呢再看一下复制之后的值啊, 都很简单啊。好,我们看一下,那么我们看一下这个原值呢,就是一个 c, 对 吧? c 的 结果是什么? c 的 结果就是,呃,一共是 十六十六个位,对吧?就前面十五个零零零零零 c, 但是他没有输出那么多零啊,他直接输出个 c, 就是 他这十六个,十五个零,一个 c, 这是他的一个输出结果啊,很很理解,对吧? c, 那 就是十二嘛,哈。然后紧接着我们进行两个复制之后,那第一个四字节呢?复制了一个 三,对吧?这个小端存储,那么他存在这一面,对吧?三三的话呢?前面是七个零,对吧?零零三,然后的话呢?下一个这个高的这个八个位呢?呃,不是八个位,八个字节呢?不是八个字节, 是几个四个字节啊?四个字节,十六个位啊,前面那就是十五个零,然后呢一个六,这个六,前面这个十五零呢?就省略了,哎,你看这个效果呢,我们一下就看到了,是不是啊?这就是这么一个东西啊?那同理啊,换句同理,什么叫同理呢?比如说我又定义了一个啊,两元素的啊 啊,两元素的整形变量,那么这个整形变量我是不是就可以完全当成这个 double 类型去这个浪浪类型去使用了?哎,没有任何问题,对吧?比如说浪 浪型 pp 啊,就装着谁啊?装着这个 b 啊,那么我这样的一个啊,两元素的数组是不是就完全能够当成啊?这样一个浪浪的一个空间去使用啊?这也是八字节吗?哎,这也是八字节,哎,正好就使用了,没有任何问题,对吧?然后是取一指啊, 啊,这样的这个写法就类似我们那个联合里边的是一样的,对吧?如果这个纸真和我们,他和我们这个 b 变量的共用的是一块空间啊, 这是这个类型转换啊,这个东西呢听着很难,其实呢很简单,对吧? 也就是说呢,我们空间这个东西呢,要有一个更宽泛的,或或者说更深入的一个理解了哈。空间这个东西呢,不管是什么空间, 任何类型的空间,它都是空间,没有区别。比如说你定一个普通变量 b, 哎,这是四字节空间,你定一个浪浪呢?是八字节空间,对吧?四字节就短一点,那八字节就长一点,对吧?你可以定一个数组,对吧?那个数组呢?就更长,哎,更多的一块空间,甚至说你可以码 lock 一 块空间,对吧? 然后呢,再或者呢,你可以是定一个结构体,结构体呢?也有一块空间,哎,就任何东西呢,都有一块空间,那么这些空间它的本质有区别吗?没有区别,都是这个物理内存上的一块空间而已,对吧?而我们能够得到什么?就是这块空间的手地址,对吧?不管他这个手地址是什么类型的,最终呢,我们这个类型可以转换呀, 是不是?哎,他是 word 星的,我们可以转成数组使用,转成这个整形使用,转成这个 double 去使用,使用的都是这块空间, 你比如他是一个数组的地址,他这个八呢,本身是个浪浪,对吧?八字节,那,那,那你就把它转成数组去使用,可以吧?没有问题,你转成叉星去使用,转成少的星,转成任何星,哎,所以说这些空间呢,不管是怎么来的这块空间,他都是一块空间这块空间的,呃, 我们得到他手地址之后呢,就可以对这个手地址呢进行一个转换,之后啊,再对这块空间呢进行任何的操作,只要比约介就可以,对吧?所以说呢, 我们这个东西啊,它的使用呢,是非常的灵活的哈,并不是说,哎,你看这是 in 的 空间,它只能当 in 的 使用,不一定,对吧?我定义这个 a, 我 把这个手地址呢我,我给它转成叉星,它是不是就成了这个四元素的叉书组去使用了呀, 对吧?哎,我叉书组四元素的,我就需要四个字节空间,你这个刚好四字空间,好,你就来吧,我就不用去 mark 了,对吧?哎,我指向你,我就当这个去使用了 啊,这是啊,这个空间的一个理解啊,一定要理解到位啊,可以数组,可以结构体等等等等,其他的通过其手地址的转换呢,只要不越界,我们就可以对这个呃空间里边的任意字节进行访问,并且呢通过任意的这样的一个方式呢进行访问,对吧? 也可以把它作为任何的东西来使用。那么强制类型转换呢,本身也是一种运算啊,咱们前面说了它是一个运算符嘛,它是不改变原数据的哎,比如说 c, 对 吧?咱们刚才说了是演示这个了哈,那 c 的 话呢,我们一个呃强制转换, 那么 c 是 没有任何变化的,它是怎样的?这是个表达式,仅仅是用我们的三点四呢去运算了一下,对吧?那三点四进行一个强制转化的,转成 int 型了,它就变成了三了,所以说这个表达式的结果是三,并不是说我这个 c 变成三了,对吧?只是这个表达式的结果是三哈,那么三的话呢,复制给 a 啊,这是 这个事啊,所以说只有复制的时候呢,才会影响,就是将我们这个 c 呢进行强转,又复制给我这个 c 了, 哎,那么这个表达式的结果呢?我们后面这个小括号啊,这个 c 表达式结果呢是三,要把这个三呢复制给 c, 那 c 呢?就变成三了,你不复制的情况下,他是不会改变的啊,这就是强制力型转换啊。咱们这块呢,也不过多多说了,主要是要把这个这句话理解到位了。你把这句话理解到位了,那么我们的这个, 呃,指这个这个强制力型转换呀,这个指真和空间的这个操作呢,就完全的懂了啊。

嗯,英语不好,能不能学西语? outbreak case 戳 comes, continue before do double else exit float four go to in in long register return short size, size of dat extract switch top define unit on side boy, voluntile, while enough。 没错,这就是 c 语言里面需要用到的三十二个单。千万不要误会,不是为了劝退,我只是想告诉你这几个单词的含义,一旦理解以后英语会不会就不再是阻碍你学习 c 语言的借口?我们先来简单分下类,总共分为六大类,数据类,变量修饰,循环跳转,条件选 择,结构体。其他。对于数据类型,这一类总共分为, char short ink, long, float, double, void。 简单来说, char 用来定一个字母, 例如, a, b, c, d, e, f, g short in long 用来定义整数,只不过三者能表示的范围不同。 for 的 定义无类型,或者定义没有返回值的函 数。对于变量修饰,这一类总共分为, auto comes, volatile, static extend register, sign on sign。 对 于循环跳转,这一类总共分为,或无 while do break, continue。 对 于条件选择,这一类总共分为, if else, switch case default go to。 对 于结构体,这一类总共分为, direct type define, union enough。 剩下的两 个 return 和 size of。 这些单词的含义不需要一下子全部学会,胡伦吞枣只会适得其反。我们在学习接下来的课程, 自然而然就能够把这些单词都记住,就像一个函数的返回值一定前面跟上一个 return, 写多了自然就记住。重要的是要多动手,不要光听我说,听见了没听见了。有时候打败我们的并不是计算机,而是我们自己相信自己学不学的好, c 语和英语一点关系都没有。