龙空技术网

《鹏哥C语言第一课》第136.1讲 #define定义常量 #大学生

鹏哥C语言 51

前言:

现在咱们对“英语单词排序c语言怎么写的呀视频”大约比较珍视,姐妹们都想要分析一些“英语单词排序c语言怎么写的呀视频”的相关内容。那么小编在网络上搜集了一些有关“英语单词排序c语言怎么写的呀视频””的相关文章,希望大家能喜欢,咱们快快来学习一下吧!

#define定义常量。

鹏哥C语言视频课。

同学们,这个视频给大家简单的介绍一个东西,#define来定义常量。很多同学可能曾经就见过#define来定义一些符号,定义一些常量值。它的基本语法是什么样子?就是这样。#define是一个以#开头的预处理指令,用它来定义一个符号叫name,name就是这个符号的名字,后面就是它的符号对应的内容。

举例来说,比如下面这地方,#define MAX1000或者100都行,对不对?这地方给大家举个例子试一下。比如现在说#define,我给定义个符号MAX等于什么?1000,对吧?可以的。这个时候大家注意,这个MAX怎么用?这个时候可以拿MAX来赋值,比如这写个m等于几?我给它赋一个MAX这样一个值。

这个地方就打印一下,我说print说"m=%d\n",这地方打印一个m的值。当然在这地方打印了m之后,可以说老师,我想把MAX值也打印出来看一下。这地方直接打印大写的MAX,来看一下。注意这个地方的结果是什么?按理来说,这个MAX是1000,那这儿就是1000,f就是1000,这儿等于1000,那这儿直接打印MAX也是1000对不对?

同学们看一下结果,果然是这样子的,两个都是1000。同学们这个大概听懂了吧?有的同学说老师你刚刚说了,这个是预处理指令,难道#define MAX也在预处理或者预编译这个阶段处理的吗?是的,它其实就是当你定义了这个MAX符号之后,它的值如果是1000,后面在你的代码里面,如果用到MAX的地方,通通要替换成它的内容,而这个替换就发生在预处理阶段。

不信我们来看一下。同学们把这段代码拷贝过来,放到gcc,现在配置的vscode的编译器里边。现在这是一个jcc的编译器,我来编译我的代码,把它放到test.c里面,保存完之后,gcc对test.c进行预处理,就一E叫预处理。预处理之后,一O生成一个test.i的文件,回车这么一敲,注意这边是不是生成.i文件了。

把这个文件打开之后,拉到最后这个地方,前面是不是还定义过一个MAX值,定义过MAX值是1000,后面这个地方就是使用了。而大家看到这边过来的时候,#define MAX不见了,同时下面用到MAX的地方都已经替换成1000了。看到了吗同学们?替换成1000之后,再把原来定义MAX符号删除掉,这就是它的工作原理。

而且会发现预处理完之后,它就彻底就替换完了。所以#define定义的这种符号,是在预处理阶段完成替换的。这个逻辑大家听懂了吗?我想应该是听懂了。

了解了这个点之后,#define可以定义一个符号,它的值可以设置1000、100这样一些数字对不对?有的同学说老师只能设置数字吗?其实也并不是,就是想要定义的,只要是符合语法规则的,它都可以。

比如这儿给个STR,它就是个字符串,比如hello world,大家注意,这也行,STR就是一个字符串。在这个地方打印print,这个地方给上一个%s来打印字符串,打印的就是STR这个字符串。STR是hello world,等预处理完之后,是不是就变成这样子了?%s打印字符串,其实就这个逻辑。

来看一下,Ctr1加f代码一走,hello world就在屏幕上,所以它的内容也可以是一个字符串。同学们能听懂吗?当然有同学说,老师还可不可以其他的?都可以,要打开自己的想象力对不对?

这个时候大家注意,比如假设想定义一个变量,这个变量,可能是一个一种寄存器的变量。

我们知道c语言里面有关键字叫register,我们这儿给大家写一下,写上一个主函数来给大家测试一下。比如说我们想定义一个整型变量,我说int这个地方可以上个num等于几?10,我希望这个10不要放到num这样的变量里边去,我希望你能够放到寄存器里面去。

这个时候有一个关键字叫register这样的关键字,它就建议这个num放到寄存器里面去,其实就这个意思。但是每次写这个register可能太长了,如果编译器没有提示的话,写起来不方便。

这个时候有人就动脑筋说诶,老师我们能不能这样做?说#define reg等于什么?这个reg是我定义的符号,它的内容是什么?就是register。当我定义了这样一个写法之后,以后我在输入register的时候,我就可以用reg了。说reg int这个地方,比如说给上一个n或者m,等于上个100。

注意那这个地方通过替换的原则的话,只要我们代码进行预处理,那这种值是不是替换成它的内容,是不是相当于也是这样的写法。所以这个define定义的reg,它的内容也可以是关键字等等,甚至也可以是一段代码。

比如说我们后面这个地方,说我们这儿定义个符号,我直接就拿过来给大家演示一下。比如说定义个符号叫do_forever,这儿它内容就是个for循环。for循环我没写错,部分没写判断部分,没写调整部分我连循环体都没写对吧?

同学们注意,当for循环这么写的时候,这3个部分都省略了。其实最关键的省略的是中间的这个调整部分,调整部分一旦什么都不写的时候,表示这个条件恒成立,那这个循环其实就是个死循环。注意for循环的调整部分,这什么都不写,写的时候表示恒成立,它就是个死循环。

所以以后我写代码的时候,我就可以这样写。如果我想写个死循环出来的话,就这样写循环,do_forever,写个封号,为什么这样","呢?因为循环总得有循环体吧。

那这个地方大家注意,其实相当于替换之后的代码,就是这样子的,循环的就是这个空语句,"循环体循环就是这个空语句。所以大家想象一下,如果我这样写的话,它就是个死循环,大家注意看到了吗同学们。所以我们定义的这个符号,它的内容甚至可以是一个代码,0K同学们,这个点大家能够get到吧。

所以#define来定义一个符号,还有自己定义内容,后面的在预处理阶段完成替换的这个逻辑,大家现在听懂了吧,好同学们当我了解到这之后,诶我不知道大家有没有注意到一个点,你会发现我们以前写代码的时候,我们可能在写完一条语句的时候,我后面都喜欢加上一个";"。

大家注意到了吧,我们这儿定义一个变量a等于几呢?10我这儿"。"一条语句结束之后,我在它的后面加上一个";"。但是你会发现#define在书写的时候,你看我前面不管是定义的这个MAX STR,哎后面好像都没写":"对不对?

那这个时候我就有个问题,我说同学,#define定义标识符的后面,要不要加上"."呢?比如说#define MAX1000;这个#define MAX 1000,这个地方要不要加";"。这个地方呢,有同学可能就想说老师,我们测一下就好了嘛,对吧这个地方给它一个MAX啊,它的值是1000我加个";",我依然把MAX给它赋过去赋给a对吧,依然把MAX赋给a。

那这个时候呢,有同学说老师,那我这儿呢就走printf,这儿呢给大家搞一下"%dn",把我的这个a一打印,那这个地方咔一测试,好像没什么问题呀。但是同学们,这一次没什么问题,但并不代表它就彻底的没有问题,只是你还没有发现它的问题而已。这个地方我想给大家说的是什么?就是以后在写#define定义的符号的时候,后面尽量不要加";",建议不要加入";",这样容易导致出错。

比方说同学们,我现在想把MAX的值打印出来,这个地方我可能想着%d来打印,后面我就写个MAX就完了。但是当你这样写的时候,同学们你连编译都编译不过去了,这里print我写错了对吧?先把它给它加上t,这个不是这个问题。

大家注意,再来编译我代码的时候,你看还是错,它说缺少"。",缺少")"在":"的前面,或者怎么样,对不对?实际上这个地方大家注意,如果你现在不懂,没关系来真实的还原一下它的应用场景。MAX的值它就是1000:以后遇到MAX就要替换成1000:了,是不是?

这个时候这替换过来,大家看这个地方printf("%d\n",然后这1000:),这写封号干什么?这不就是多余的吗?所以你看它就不符合语法规则了。如果你这儿给我加上多余的这种":",你们感觉到了吗?

当然有些人不服气说老师,真的是这样吗?来同学们,我们把这个代码就删掉了,或者就留着删掉也行,这我就给大家简单的删掉。我把这个代码都拿过来,放到这边,大家注意,然后我再次对它进行一个预处理。

预处理之后大家注意,去观察这个.i的文件,这我没有保存是不是?保存了对吧?然后过来,大家看替换过来之后,这个地方变成1000:看到了吗?在预处理之后的结果里边,这不就错了吗?这就语法问题。

ok,懂了吗?get到了吧?所以以后在#define定义的符号的时候,在最后尽量不要加封号,它容易出错。当然,这个地方可能还有一些其他的场景,也可能会导致出错。比如这种场景,i(condition)如果条件成立的话,把max的值赋值一个MAX,就是上面这个max赋值一个大写的MAX;else max等于0。这种写法也会有问题,为什么?当这样写的时候,大家注意i后面没有加大括号,else也没有加大括号,else里面是不是只能控制一条语句?里边只能if后面只能跟一条语句。

但是当这样写的时候,大家注意,这个MAX要被替换成1000,这儿替换成1000的时候变成了max=1000,这是一条语句了,后面又有个分号叫空语句,这后面有两条语句了,这个时候编译器就到这个地方,编译器就会报错了。当然这个后面跟了两条语句也可能会导致问题。

同学们,这个逻辑大家听懂了吧?所以综上所述,给大家想说一下,就是#define在定义符号的时候最后尽量不要加符号,如果后面在使用的时候需要"。",后面使用的时候加"。"就可以了,不要在这里面加上,这个不是一种好的编程习惯。

同学们,这就是#define如何来定义以及它的底层的替换规则是怎么样的,以及它在书写的时候的一些注意事项。同学们听懂了吗?如果大家现在听懂了#define来定义符号的知识,这个视频的目的就达到了。

同学们如果大家听懂,请给鹏哥的视频点个小红心,这个视频讲到这里,下个视频再见。

标签: #英语单词排序c语言怎么写的呀视频