粉丝6.0万获赞34.0万

如何理解 c 语言的框架代码?一、 include include 是一个预处理命令,他告诉 c 语言的编译器在实际编译之前引入 stdio 点 h 文件,这个文件是 c 语言的一个系统 库文件叫标准输入。输出头文件包含了基本的输入输出函数,如 printf 用于打印输出, scanf 用于接收用户输入。此类函数在 c 语言中非常常, 因此 sgdiodh 被广泛使用。在代码中写入这一行,编译器会在编译的过程中将它替换为这个头文件里面的所有内容,这样程序就可以使用其中定义的所有函数。其中间括号就是用来包含这些头 文件。如果你需要包含自己写的头文件,那么请使用双引号,这个我们就不再展开了。二、程序入口 intman 是 c 源的程序入口,也是操作系统运行 c 源程序时调用的入口。这里的每一个词都对应一个特定的含 i、 n、 t 代表的是整形,意思是这个面函数返回的是一个整形,而整形就是整数的意思。在程序中,他们用来表示程序执行的状态,比如返回零的时候代表正常运行,返回其他值 就代表异常或者错误。 man 则是函数的名称,也是程序开始执行的地方。最后的括号表示这个 man 函数是不需要传任何参数的。三、 程序输出 printf 是 c 元中用于输出的函数。 printf 意思就是 print formate。 函数根据指定的格式输出一系列的变量,这个字符串可能包含一些站位符, 这些站位符在输出的时候被后面列出来的变量所替换,就像输出这句话, 哪句话呢?去夜深人静写算法,回复 c, 就能获取这个软件的下载地址了。这句话 四,函数调用恭喜你,双十一马上结束了,课程的优惠马上到期,如果现在还没有做好准备购买,但是以后确实想要,可以先从这个视频的链接进点击领取优惠券,领取以后,后续即使活动结束,你还是可以通过这个券进行满减活动。如果是刚刷到我的朋友,可以先看看试看课程。同样在这个视频链接里,我给大 大家开了十几节的试看课,就是为了让大家想清楚以后再来决定是否要学习 siri。 你看到了这里。然而立扣只需要实现这样一段代码,完全不需要 include 的一击 man 函数,原因就是他也是一个程序,他后台有一个 man 函, 然后在内函数中调用你实现的代码,像这样,如果结果是对的,就给你返回正确。所以本质上你在立扣上写的代码和传统心源没有区别, 因为语法都是一样的。不同点在于力扣上不需要写一些复杂的模块代码,而让你把精力集中到算法本身,你明白了吗?

大家好,今天给大家介绍一下 c 语言的特文键和原文键,在 c 语页里面呢,特文键就是点 h 即为,原文键就是点 c 即为,这是文模文件。 一般而言呢,当我们实现一个功能的时候,我们都会匹配的定义一个头文件,对吧?那么头文件 里面我们一般包含哪些信息呢?一般而言,假如说这个功能要提供 给别人使用的时候,那么别人只需要看你的头文件就可以了,原文件是不需要看的,因为有些库函数他们打包好了之后,就是一个二进制文件,你是打不开的,对吧?他提供给你的就是一个头文件,那么我们的头文件呢, 也应该具有这样的功能,任何没有必要让用户知道的,或者对用户没有意义的信息,都不应该放在这个投文件里面。举个例子, 这个加法函数呢,调用了一个局部的加法函数,对吧?这个函数呢,只用于这个文件内部,那么我就把这个函数定义成 就不使用的,而不应该像这样,然后把这个也放到图文界里面,这样做就不合适的,因为这个函数 不需要被外部的其他功能调用的,对吧?所以这么做是不合适的。但实际的 工作中,我发现很多人啊,在偷闻界里面包含了很多没有意义的,或者说他从来不使用的信息, 就像我刚才这个函数一样,他把它放在这里,对吧?放在这里对整个项目而言,他仍然能工作,但是这个就是代码的组织呢,就比较乱,因为我们 这个函数比较简单,有些函数比较多的情况下,你把没无关的没用的函数放在图文件里面,你就会看起来会比较复杂,这是其一。 还有一个为什么要投文件呢?就是说我们代码生成的过程是编翼、连接、运行 变异,就是把每一个元文件变成目标文件,对吧?前面还有朋友跟我说,为什么用呃 stm 三个 q 八 id 会生成那么多没有用的文件,实际上那些是中介文件,你用任何一个 bet 生成都会有那些中介文件的,不是和这个和 bet 没有关系。那么在 be 的过程中,比如说美女 这个原文件要把它转换为目标文件,在这个时候呢,比如说这里有个 爱的函数,对吧?他首先会在这个当地的文件里面找,看看有没有这个函数,没有,对吧?那么他 就在俗语的偷文件里面找,看看有没有这个函数。假如我们这里把它注册掉,那么我们重新编一下看看。 首先呢,这里有个隐含的,因为我们没有包含吗?在这个第一系,相对来说他的版本比较新,所以他还能把它关联到我们这个, 所以他还能关联到这个项目里面啊。其他的文件里面已经有这个加法的函数了,所以他不是一个错误。如果是老版本的这个第一期的话,他有可能就会报错,因为这个 函数找不到他鼻翼是通过不了的,所以头文件的作用就在这里。我们在编 意的时候啊,就是告诉变异器这个函数是存在的,当然他这个变异的过程中,他只是知道有没有这个函数就可以了。具体这个函数的代码在哪个位置啊?那是在连接的时候在关联起来的,所以 这个头文件的作用就在这里。还有呢就是比如说多个原文件可以同样,比如说多个地方需要使用到这个加法函数的时候,我们都只需要包含这个 投文件就可以了,非常方便,对吧?他可以重复包含的,但是重复包含的时候,为了避免发生冲突呢,我们这里要所有的投文件里面都有一个这样的 变异欲处理 这个定义呢,我们一般喝这个文具名 一样把它写成大写的,具体怎么写都可以,具体怎么写没有那么严格,都可以,这个没有 强制的要求。还有一点呢,透风机,我们有些时候这个摇滚机里面定了一了一个变量,需要被其他地方使用,对吧?我们可以 在对应的投影机里面增加一个,把它声明成外部的这个,这是这是一种生命方法,当然你也可以不放在这里,你也可以放在这个地方需要用它。 那时候呢,你把这个说明这个 k 在外部定义的,因为他这这个 k 是在这个文件里面定义的吗?那么这么使用 k 也是没有问题的。 但是这种做法有个问题,就是说如果你在多个原文界里面都使用到 k 的话,你在那你就必须在多个原文界里面都要加上这句话,对吧?是不是很麻烦?所以我们一般呢就把它放在这个 对应的投文件里面加一个这样的声明就可以了,这样的话在我们其他的原文件里面包含了这个投文件,我们就可以使用到这个 k 了。

兄弟们,我敢说很多人配完环境变量都没真正理解它到底是干嘛的。我们先看一段 v c r windows 键加 r 键,打开运行框,输入 clc, 敲一下回车,那么系统自带的计算器就打开了, 计算器的文件名就叫 clc, 但我们自己写的 helloworld 程序,在运行框里面输入名字,不光执行不了,还会报错, 操作系统明显就是在区别对待,原因就是环境变量,咱们先看一下环境变量在哪,右键我的电脑,点击属性,再点击高级系统设置, 再点击环境变量,就打开了环境变量窗口。左侧呢是环境变量的名字,右侧是对应的值,我要被这些数据辅助他,本质上是很简单。通常我们配环境变量, 大多数时候指的是这两个 pass, 他 们各自存放一组文件的路径,也就是文件夹的名字。那这两个 pass 具体的作用是什么呢?我们一个一个的看,系统 pass 呢,它的值就是一些系统文件的路径, 其实就是 c 盘里面一些文件夹的路径。在运行框里面输入了 clc, 按下回车之后,操作系统会挨个的在这些文件路径里面搜索名字叫做 clc 的 程序, 找到了就执行,找不到就报错,那 clc 也就是计算器就包含在某一个路径里面, 所以操作系统肯定能搜索到。这就是为什么在运行框输入了 clc 以后,尾车就可以打开计算器。 对于系统派斯呢,我们一般是不动它,用户派斯才是我们要操作的,在安装某些软件需要配环境变量的时候呢,都是在操作用户派斯就是把指定的一些文件路径给加进去,让操作系统在使用的时候能搜索到。 装进一下这个 pad, 将文件的路径加进去,比如就将 hello word 的 路径加进去,点击一下,确定现在在运行框运行 hello word 就 一点问题都没有了, 做到这里基本上就明牌了。这两个 pad 呢,就是多个文件路径的集合。按照这种设计,操作系统他不用关心程序在哪里,他只要负责在这些文件路径里面去搜索, 找到了程序就运行,找不到就报错。那很明显的一个例子, hello word 的 路径在没有加入环境变量之前,操作系统找不到它,在运行框就执行不了, 把它的路径加入到环境变量之后,操作系统就可以找到它了,运行框执行就成功了,就是这么个原因。说到底,配置环境变量就是把程序所在的路径告诉操作系统, 让操作系统能够定位到,因为咱们总不能让操作系统全硬盘全文件的去搜索吧,那样就会很慢。通常情况下呢,操作系统在派斯里面搜索程序的时候,他会先搜系统派斯, 然后再搜用户 pass, 搜到了就会立刻执行,然后停止搜索。所以说,如果有同名的文件,哪个运气好,路径排在前面,哪个就会被先搜索到,就会被执行,那排在后面那一个对不起喽,就没机会执行了。 pass 呢,是常用的,那其他的环节变量也有各自的一些含义,比如说这个 temp 变量,这高速程序临时文件在哪? 我们可以将环境变量看作是程序和操作系统之间互通信息的一个公告板,方便操作系统做事,或者说方便程序获得系统的一些信息来做事。这一些呢,就简单说说, 混一个脸熟, ok, 那 这集视频呢?就这么些内容了,下一集再见。 nice。

无废话,疏通数族指征官前提醒,这张设计的原理太多了,如果你只是为了考试学习与其深究原理,我建议你只管记住就行了。等你会用了,我们再扯原理的事情。第一张数族名到底是什么? 简单解释一下代码。这里我定义了一个数组 a, 它有三个元素,分别是 a 零、 a 一、 a 二。因为 int 一 般占用四个字节,所以我们假定这三个元素的地址分别为一百一百零四、一百零八。然后我让 ptr 保存了 a, 下面的内容是 c 语言规定的,你记就完事了,别管太多。首先, a 本身的值就是 a 零的地址,我们可以用 printf 来验证它。 其次,大部分时候 ptr 和 a 是 等价的,它们都会被编辑器当做指向 a 零的 int 类型指征。 ptr 和 a 不 同的地方在如下三条,第一, a 只是一个标识符,它不能被赋值,这一点它和指征是不同的,如果你尝试对 a 进行赋值的话,变器会报错。 二、 size off 计算的结果是不同的。 size off 是 一个计算括号内结果占内存大小的计算符。当你尝试对 ptr 进行计算时,它固定结果等于八。这是因为六十四位系统中任何指的地址都是八个字节。 当你对 a 进行计算时,计算结果为整个数组的大小,即三个元素乘以单个 int 元素占用四个字节等于十二个字节。 第三,取地址运算结果不同。对 ptr 取地址的结果是指真 ptr 自己在内存中的地址,而对 a 取地址的结果是返回了一个没有名字的数值。指征这个东西具体是什么我们以后面再说,现在你只需要知道它计算结果不同就行。 第二张指真地址加减法,还是刚刚的那一份代码?当我在计算 ptr 等于 ptr 加一时发生了什么?知觉上, ptr 保存了 a 及 a 零的地址一百,那是否说明此时 ptr 等于一百零一呢?所以指向了 a 零的第二个字节。 然而并不是。此时 ptr 等于一百零四,即指向了 a 一。 c 元会在指增加减法时做两件事。第一,首先查看一下这个指增是什么类型的,并获取这个指增指向类型的内存大小。例如,在此处, ptr 指向 int 型变量,而 int 型变量的大小为四。 第二,将整数加减的量替换为它指向类型内存大小的整数倍。 ptr 加一会被替换为 ptr 加一乘以四,即四加四个字节,让 ptr 从 a 零指向 a 一。 那为什么要这样做呢?想象一下, a 零占用了一百一百零一、一百零二、一百零三这四个字节,如果我不小心让 ptr 指向了一百零一,会发生什么事? 因为 int 的 内存占用大小为四。当你使用解除 ptr 尝试修改整形变量时,这个操作会修改一百零一、一百零二、一百零三、一百零四这四个字节上的内存,这会直接破坏掉你的 a 零和 a 一 两个数据,导致不可预料的后果。 第三章中括号到底是什么?你得有一个观念,中括号和加减乘除一样,是一个计算符,它不是和数组强绑定的。中括号左侧的计算量是地址,中括号中间的计算量是地址的偏移。 例如 a 一, 它完全等效于 a 加一解除引用的这一个变量,既然中括号左侧的计算量是地址,那 ptr 也可以使用它。下面这些变量都是完全等效的,只要你能看懂这一个表,那这一张你就学会了。 最后说明一下,本章是为下节课多维整数做铺垫,如果你看不懂,那拿着背就可以了,不需要深究。

c 语言三十六计第三十二计,空城计,不战而屈人之兵的网络安全智慧其实这个空城计它的原文就是虚者虚之,愚中生愚,刚柔之计,其而复其。 对,它的意思就是说,当你本来就很空虚的时候,你就干脆再显示出你很空虚的样子,让敌人反而更加难以揣测。在敌我力量悬殊的情况下,这种策略显得更加奇妙, 这是一种通过虚张声势来迷惑敌人的策略。哎,这个用空虚来迷惑对方真的是很高啊。那我们就来进入今天的正题,空城计在 c 语言的网络编程里面是怎么来实现服务器的伪装防御的?它到底是通过什么样的手段来隐藏服务器的真实状态,然后来迷惑这些攻击者的? 在 c 语言的网络编程里面,其实这个空城计就是服务器伪装防御的一个艺术。对,它是通过 不返回或者是给你一个假的返回来让攻击者摸不清你这个服务器到底是什么情况,你到底有没有开着 你这个服务到底是不是可以被攻击的?哦,原来就是让对方连你这个服务器是不是活的都搞不清楚,对,这确实挺头疼的。是的,然后这个服务器他既可以模拟一个不存在,就是你发一个请求过去,他就跟你超时了。对,或者是说他给你返回一个看起来非常真实的错误信息, 但是其实他都是在迷惑你,让你没有办法去通过一些自动化的工具去探测到他,那这个时候你的攻击难度自然就加大了。 所以说,空城计的核心策略,制造不存在的假象,到底是怎么来通过这种伪装的返回或者不返回请求来实现呢?他的迷惑性和隐蔽性到底有多高?那其实就是模拟一个服务器不可用或者根本就不存在的这样的一个状态。 那攻击者可能就会觉得,哎,我这个目标是不是我搞错了?对,然后他就会放弃继续扫描或者是攻击你?对,因为你给我的这个响应跟我真的去访问一个不存在的东西是一模一样的, 那我就真的很难去分辨。没错没错,而且这个东西他还会模拟一些真实的错误的响应,或者说超时,然后他本身又不会留下任何的额外的痕迹,让你的这个自动化的工具可以识别出来,这是一个防御手段, 所以他其实是一个以柔克刚的非常巧妙的通过这种心理上的博弈来保护你的核心的资产,确实很厉害。 那我们再说说隐藏真实的服务器状态这个事情,他到底在网络安全的防御体系里面扮演一个什么样的关键角色?这个隐藏真实的服务器状态,其实他是防御里面的一个非常精妙的计谋,他是藏在这个伪装的返回,或者说干脆就不回应你的这个请求的背后的。 那你攻击者就没有办法通过正常的手段去刺探到你服务器的系统架构,你有什么弱点等等,那你就相当于给你的这个系统穿上了一层看不见的盔甲。这么说的话,切断攻击者的情报渠道确实是比单纯的去堵漏洞要高明很多。是的是的,虚则实知,实则虚知嘛, 就是你越让他摸不到头脑,那你的这个防御其实就越稳固。那我们就用代码来演示一下空城计在服务器的这个伪装防御里面到底是怎么用的。对,比如说我们现在有一个恶意的请求过来了, 那我们的服务器是怎么通过最少的资源消耗来把这个攻击者给迷惑掉的?比如说我们在代码里面去判断,如果这个 request type 它等于 malicious, 那 我们就可以直接伪装一个正常的响应给他。 对啊,比如说我们就返回一个 http, one point, one two hundred, ok, 然后面都是空的,那这个时候其实攻击者他就会以为他自己的这个攻击是成功了的, 但是其实我们的服务器什么也没有做,我们只是用了最少的资源给了他一个假象,这样的话攻击者他就会觉得他已经拿到了数据,但其实他什么也没有拿到,还浪费了他的时间和资源。对,而且我们还可以加一个延迟关闭的这样的一个操作,就是让他在建立连接和探测上面花费更多的时间, 同时我们还可以把他的这个攻击的信息都记录下来,然后迅速的结束这个连接,这样的话我们就可以最大程度的去保护我们的这个核心的业务不被他干扰到。好, 顺着这个思路我们再来说说这个空城计的智慧在网络安全防御的艺术上面还有哪些体现?就是他是怎么通过这种伪装和迷惑真正的提升服务器的安全性的。空城计其实他的这个核心的思路就是你通过伪装返回,或者说干脆就不响应, 让攻击者没有办法去摸清你服务器的真实情况,那他可能就会产生误判,然后放弃他的这个攻击的尝试,其实他是一种非常高明的心理战。所以说网络安全其实不光是技术的对抗,还是一场心理的博弈。没错没错, 你只有时刻的去洞察这个潜在的威胁,然后主动的去营造一些假象,你才能够真正的去掌握这个网络安全的主动权。那这个空城计的思想在蜜罐技术和入侵检测上面是怎么具体的去发挥作用的? 其实在这个高级的应用里面,蜜罐技术就是一个非常好的体现空城计思想的一个技术。我们会布置一些虚假的服务器,然后去吸引这些攻击者过来攻击我们, 那同时呢,我们会用入侵检测系统去实时的监控他们的一举一动,去分析他们的攻击路径和他们的行为特征。哦,相当于我们故意给他们设了一个圈套,然后让他们自己往里钻,我们还可以趁机把他们的这个攻击手法给研究透对,通过这种诱敌深入,然后全程监控, 我们就可以把原本被动的防御变成主动的去掌握敌情,那这个也是现代的网络安全体系里面非常重要的一个主动防御的环节。好了,第三十二计,空城计的服务器防御执法就讲到这了,下一期解锁第三十三计,反间计,咱们下期见。

今天我们来看一下整数、数组、函数它们之间的关系。先来看一下函数的一般格式, 函数主要是将实现同一功能的语句放在一起,实现功能模块化。如果实现这个功能,需要函数 y 的 数据就通过参数列表传进来, 如果产生新的数据,就通过返回值类型返回。上节课我们说过,在参数列表也可以定义多个整数变量。在函数内对整数变量进行解引用,也就是找到函数外的一个存储空间, 对这个存储空间可读可写,如果读出一个数据,就相当于间接的传递一个数据到函数内,如果在函数内对它进行负值,就相当于间接的传出一个数据。 也就通过数值变量可以实现函数内数据的输入和输出。接着我们看一下数值变量,数值,这个数值有四个元素, 定一个全均变量,这个变量用来存储这四个数据的平均值。接着定一个函数, 这个函数有一个输入参数,就是一个数组,这个数组同样有四个元素,在函数内定一个变量,用来存储这四个数据的平均值。接着返回平均值, 在 main 函数里调用这个函数,首先有一个输入,是数组名,有一个输出给全局变量。 那我们看一下这个数组有四个元素,每个元素都是昂三的差类型的。这个入口参数他也有四个元素,每个元素都是昂三的差类型的。这样来看他们的类型是不是一致,就可以直接赋值了。 就是我们会不会这样想,全聚变量它是一个数值,然后将这个数值当中的每一个元素复制给局部变量,这个数值当中实际上不是这样子的,我们说数值名,它的类型是元素类型的指征, 那么这里的数值名,它的类型就是啊三的差类型的指征,这时候我们看入口参数,它又是一个数值,这个时候类型就不匹配了。 实际上在翻译阶段,他也会退化成一个元素类型的指征,翻译之后就是这个样子的,那么他的类型也是一个元素类型的指征, 所以说两个类型一致就可以直接赋值。接着我们来看一下这些变量的存储空间分配,然后来了解他的数据传递过程。首先是两个全局变量,两个局部变量 在执行命令函数之前,要为全机变量分配存储空间,我们将虚线上面大概分为战区,下面是全机数据存储区,为全机变量分配存储空间。接着往下执行程序,遇到函数调用函数。 调用函数的时候,有一个压战过程。压战过程首先是现场保护,将一些现场数据进行压战,接着是函数的返回地址压战,这两个过程我们暂时先忽略。然后是将局部变量压战,也就是为局部变量分配一些存储空间。 现在存储空间分配好了,那么就执行函数。我们想一想这个八或矩阵变量存储的是不是宿主的地址,因为宿主名就代表宿主的地址嘛,也就是将宿主的地址零零三零复制给八或, 那么八或加零是零零三,零是一个地址,八或加一是零零三一也是一个地址,八或加二,八或加三都是一个地址值,注意它们仅仅是地址, 只有对它们进行解引用,才可以找到这个存储空间,对这个存储空间进行读或者写。 接着我们来看一下程序,对这四个数进行求平均值。这里的八 f 中括号零也就相当于八 f 加零进行结引用, 八 f 中括号一也就相当于八 f 加一进行结引用。它们只是两种不同的写法,实际上是一样的, 也就是通过前面的写法可以读写这个存储空间的数据,通过后面的写法也可以读写这个存储空间的数据,使用是一样的,只是不同的写法。接着我们来看一下,通过八 f 可以 找到这四个存储空间,那么通过什么可以找到这个四呢? 这个四是我们大脑中记忆的,是我们手动写进去的,但是我们说函数是实现功能模块化, 就是通过函数的输入和输出接口就可以实现功能,不需要在函数内部再进行修修改改,所以说在函数内要修改数组元素的个数是不太好的。那么我们在接口处再定义一个变量, 这个变量用来存储函数的元素个数。那么在调用函数的时候,在输入接口要写一个数组元素的个数, 因为数组实际上退化成一个时针变量,这个时针变量并不知道这个数组有多少个元素,所以说我们一般在入口处再定义一个变量,用来存储数组元素的个数, 那么执行完函数就会返回,返回就涉及到一个出站的过程,就会释放这些存储空间 s p 来到站底,那么这个时候站区就是空的,接着执行下面的函数,注意看一下这里的八或加零皆引用,八或加一皆引用。 我们说八或这个变量已经没有了,已经释放了,那么这样使用就没有什么意义了,所以说不可以这样使用。 在函数的入口处定义一个数组,实际上也是退化成一个整数变量,那么我们来看一下整数变量的本质就是他想获取谁的地址,就可以获取谁的地址,对这个地址的存储空间如何解读,也是整数变量自己说了算。 回到我们今天的主题, 在参数列表定义数值,实际上也是退化成一个整数变量,那么在函数内部进行解引用,也就找到了函数外的一个存储空间, 读取这个存储空间的数据,相当于输入一个数据到函数内部,所以说它是一个入口,如果对这个存储空间进行赋值,就相当于函数内输出一个数据。 下节课我们来看一下他的输出,实际上都是一样的。这节课到此结束,拜拜。

这个视频你将快速学会计算机二级 c 语言中的部分技术题目,视频时长大概十分钟,题目包含单选择题、程序填空题以及改错题,还有编程题。 好,来我们看一下单选择题的第一题啊,按这里说,以下不合法的用户标识符是哪一个?这种呈送分题啊,你先知道标识符它的格式应该什么样子的, 它首先是不可以以数字开头,那不以数字开头,你看这个 b 是 不是就有数字开头了呀?那肯定选它呀,不合法嘛,对不对?那么标示符我们可以用大小写字母来 来写啊,但大小写呢,它要区分,如果说大写的这个大写的 a, 然后 b c 和这个小写的 a b s a b s, 然后这里写成 c b 了。好, b c 它俩啊,是不一样的,是两个完全不一样的标志符,明白吗?所以我们严格区分大小写。然后这里也可以用下划线开头,你看这里的 c 选项,就是下划线开头,然后看第二题啊, 设定 a 等于二, b 等于三,执行一个 print f, 摆好 d, a 大 于 b, 然后问号啊, a 冒号, b 输出什么?那首先呢,你得搞明白这个 a 大 于 b 这个东西是什么意思,对不对?这玩意其实就是一个三目运算符,我给你解释下你就知道了,它其实呢,就是让你去判断 a 大 于 b 吗?这个问号表示 money 大 于 b 吗?如果说 a 大 于 b, ok, 那 我后面就它,其实这一堆就等于这个 a, 哎,如果说这个 a 不 大于 b 呢?那它其实就是等于这个 b, 就 这意思。但你先来看啊,它这个 a 大 于 b, a 是 二, b 是 三,那二大于三吗? 并不大于,对不对?所以它就应该是后面这个 b, 这后面这一读音就是 b, 那 b 等于三,它执行的是输出 b 的 值,那值就输出一个三呀?答案就应该是选这个 b 选项,我们可以实际运行看一下啊。这里我也把代码写写了,我们可以运行看看情况啊, 让我们来看。呃,运行看吧,是不是就这个三? ok, 来接下来下一个题啊。第三题,他说 c 元素组下标只能是什么? 呃,那你要了解一下下标的话,你要先知道数组,如果说数组你不知道,你下标肯定没没法弄了哈,其实数组很简单。来,我们来看一下这个。 呃,我写的这一对吧, int a r r, 然后后面中括号一十,它表示就是一个数组啊,数组它的元素它的这个位置个数呢,一共是十个。呃,后面我给它初指划了一个值,一二三四五六七八九十啊,十个。然后呢, 我们说这个下标其实就是你后面在用这个数组的时候,你看我们用的这个这玩意,这个零就是下标从第一个位置,我们说位置哈,这个位置他的下标是从零开始的,这里就是零,然后这里是一二三,所以他到最后啊,应该是只有九,对不对?因为从零开始 好,然后啊,我们把这个来运行看一下吧。嗯, 我们看啊,呃,如果说这里 a r r 零,那是不是就让我输出第一个元素,对吧?那就输入第一个,那这个零它不就是整型常量吗? 对不对?那后面这个表达是啥意思啊?就你看我现在定义一个整形的 i, 它等于零,那现在我输出的时候,我把这个下标搞成 i 加一, i 是 零,零加一不就是一吗?那其实我输出的都是 a, r r e, e 的 话,就是对应的第二个位置二,我们看一下结果哈,来运行, 是吧?一二,第一个是输出第一个位置的,这个二就这样子的哈, 所以呢,它这个 c 元素组下标啊,只能够是整型、长量或者说表达式,其他的都不可以啊,浮点型不行,字母型不行,任意类型肯定更不行了。 ok, 那 我们现在看接下来题目, 这一个呢,是一个指数定义, int a 五,然后新 p 等于 a 定义呢?有一个指数 p 非法引用数组元素的是哪一个?就是不可以这样引用的。那你选一个错误的引用,我们先看这个屁,它啥意思呢?新屁啊,其实就是一个指征,它等于 a, 那 这个 a 呢?数组的这个名字其实就是它的这个首地址,其实就是它的那个第一个位置首地址的意思啊, 所以呢,这里就直接等于 a, 那 么现在啊,它新 a 加二,这个数我刚刚不说了吗?数组的名字就数地址,那数地址就是数,总便利是从零开始,那此时的 a 它应该是,你可以理解成零,零加二,那它这个便利的话,便利到是不是应该是它的下标应该就是 二,对吧?零加二嘛,那新新二,新二,那就是新它的下标,你这样引用的话,我们可以看下结果吧,我们来看一下啊,这里有代码, 你看,我现在定义了一个数组,它的元素个数的是五个,一二三四五,然后新 p 等于 a, 弄了一个时针指向 a 的 这个手地址, print f, 我 们把这个新 a 加二给它输出出来,我们可以看一下结果啊, 来看一下三,对吧?三,为什么是三呢?你这样理解,我现在给你画个图吧。啊?我用画图来,怎么打不开呢?画图?好,我先画个图啊,我们画一个方格, 这就是你的内存,一个、两个、三个、四个、一二三四五,好,五个,是吧? 现在呢?这个 a 啊,他其实就是这个手地址,比方说他是零零零零,就这个手地址吧。 好,就是他,那现在呢?他就这个手地址加个二,那地址加二是不是就变成了这是,这是零零零一哈,这是零零零二,那加二不就变成零零零二了吗?对不对?那就相当于就是这个,就只剩下这个他的元素,那新的解意后面这个是地址, a 加二是个地址,地址前面给个解解意 啊,给个星就是取它的这个实际的内容,那取它的内容的话,那这个数组格子里面存的是哪一个呀?如果我这里的定义它是哪一个?零一二,第三个格子是哪一个就是三呀,对不对?是不是这个意思啊?好,然后呢,我们看它的 b 选项啊, b 选项是一个 p 二, p 二的话, p 本身是个地址, 那他 p 二,他引用了个下标,那是他手地址,那其实和 a 二是一个意思啊。 p 二和 a 二是一个意思,那那么二下标为二的话,那其实就是第三个,第三个位置,那也是这个啊,对不对?也是这个三啊,所以啊,这个数字他也应该是三,然后我们这个再看下一个啊, a 五 可以 a 五吗?下标可以为五吗?一共就五个元素啊,他的下标可以引用到几零,一二三四,最高,最高到四,他到不了五,对不对?下标从零开始引用吗? 所以啊,他这个不行,最最,这就错误了啊,应该选 c, 其实你如果说你不懂指征也没关系,你如果知道下标,你直接可以用用这个,一下就能看出 a 五是错的,因为下标是从零开始,他根本到不了五啊,那直接就可以选到 c, 你 如果不懂这个指征也是能做出来的啊。好,然后呢? d 先用 p 加二, p 式手, p 式的,他指上的是这个输入的手地址吗?那 p 加二加二,那不就是从第一个第零这零个定这个定零啊,然后加二的话变成三,那零一二到这个到这个位置也是也是,他的内容也是三吗?所以啊啊,最后他整体的输出呢?我们再看一下吧, 整体的全部输出都是三,就这样做出来的。好,然后接下来我们再看到下一个题目, 关于函数说法正确的是哪一个?这玩意记就行了啊,他可欠套定义吗?不行,函数不可以欠套定义就是不能在函数里面啊,又定义另一个函数,大家可以在呃,也不行啊,也不能在主函数定义,函数里面是不可以欠套定义的。 好,这里欠套调用吗?可以欠套调用啊,你可以在主函数里面调用其他函数,你也可以在其他函数里面调用其他的更就在其他的函数可以调,可以欠套调用了。然后命必须在最前面吗? 不要求啊,命可以在后面,然后必须有返回值。函数不是必须有返回值,它可以是无返回值的函数 v, y, d 嘛,可以不用返回,可以没有返回值啊。好,然后现在我们来看程序填空题,它要计算 e 到 n 的 累加和, 那么这个累加和我们怎么去算呢?你看一下啊,它这里 int n, 然后 sum 等于零 i scan for by for d, 然后传递值 n 就是 把这个 n 的 值让我们输入一下啊,然后 for i 等于一,从一开始后面让我们填个空, i 加加,然后这里 又是第二空 print f sum 等于多少?就让我们算,就直接输出它这个累加值 sum 了。那现在你想一想啊,你算累加的话,其实不是从一一直加到这个 n 吗?对不对?那一直加到 n, 你 这个空应该填啥?你想一想应该填啥? 是不是得填 a 小 于等于 n, 当 a 小 于等于 n 的 时候,我们就进入这个负循环,它进去之后,我们就对上累加上加等于 i, 就 这样写上加等于 i, 你 看第一个循环的数字是上,它上加等于 i, 你 如果不理解,你可以看它其实是等加这个了哈,就等于上等于上加 i, 那么此时的 sum 是 零零等于不对啊, sum 等于零零加 i, i 是 一零加一好,你进入第二次循环的时候, sum 就 变成了一了,然后一等,然后 sum 就 等于一加 i i, 此时的 i 是 多少是二? 好,一加二就是三了。那这样一直累加到最后呢?你把把这个 n 加了之后啊,那就结束了呀,是吧?所以我们这里就是 i 小 于等于 n, 好, 然后最后你这里 就完了,这里就是 sum, 你 可以写这个 sum 加等于 i, 或者说你写 sum 等于 sum 加 i, 一个累加就结束了。这个题就很简单哈,好,然后呢,我们来看一下这个程序改错题, 它其中两个整数的最大值啊,两处错误,我们读一下啊。 include s t, l 点 h, 这没错,然后 int main 传输, int a, b max 定义三个, 三个变量,然后 scanf 百分之百分之百分之百 d a, b, 哎,有问题了对不对? scanf 里面这个我们是不得取地址啊,是吧?不能直接传这个,要取它的传它的地址,所以我们要百分之百分之传这个地址啊,取地址,这也是第一个错误。然后 if a 大 于 b, 哎,哎,注意到这里有个分号没有 if, 后面我们跟分号,那不是表示这就完了吗?还会运行这个 max 点 a 吗?不会了对不对?这就直接往下走了,那这个 if 你 就没有任何意义嘛,因为类 if 里面没有内容,所以我们这个分号要去掉啊。分号去掉就直接 if a 大 于 b 好, 至于它为什么没有打大括号呢?因为你如你后面只有一句嘛,有一句的话你可以不打大括号, 如果是一句以上两句三句,你需要打一个大括号。好,然后其他的 else max 等于 b 就 没问题。 print f, 把这个输出出来,对的好, return 零结束好。最后一个,我们来看一下这个编程题啊, 第一个编程,他说输入整数 n, 计算 n 的 阶乘,呃,让我们去把这个输出出来,算出来结果输出。其实这个蛮简单的哈,我们看一下我写的吧。嗯,把前面呢先注视掉, 就这个程序。首先呢,你,你要输入一个整数 n 嘛?那你是不是得定义 n 整数 n。 好, 然后我们要输入就 scanf 把这个 n 复合值,接下来呢?它要我们计算 n 的 结存,那么我我得定义一个结果,因为我得输出啊,我输出了,我就 int alt 等于一。好,接下来 for int i 等于一, i 小 于等于 n, i 加加 alt 乘等于 一。这啥意思呢?就是你看啊,现在的 i 是 一,对不对? alt 是 零啊? alt 是 一, alt 是 一,一,然后 alt 它就现在我们进入循环之后 一小于等于这个 n 吧。比方说你 n 输入的是五,一小于等于五,我们进入这个负循环,此时 out 是 不是就要 等于一乘以一个 i, 一 乘一就是一,然后接下来第二个循环就就变成了一乘二等于二。第三个循环呢?就是二乘以三,那不就一直在累积往后面去乘吗?那这个就是一个。呃, 就是直接,我们就相当于是把一一直乘到了五就行了。因为当此时的 i 它能够等于五的时候,就没有办法再进入 i 等于六了,因为它不满足这个六不是小于等于五的吧,所以就没法再往后面去运行了, 它还是这样子的,累加到累乘其实差不多了啊,看,之前我们不是有一个累加吗?它俩差不多的意思。好,接下来我们就把这个 alt 给输出出去啊。 by f d 输出就 return 零。结束。 第二题呢,一个数组题,这题都挺简单的哈,就是同学们如果说要考一个二级的话,这些题是你必须要搞懂的,非常简单。 来,我们来看一下这个数组题啊,他输入十个整数,存入数组,并找出最大的。这个其实比第一个题简单, 首先我们定义一个数组啊,开 b 十个空间, a r r 一 十 for int i 等于零, i 小 于一十, i 加加 scanf by f d, 我 们把这个呃输入进去,因为它要输入十个整数,乘入数组嘛啊,所以我们就 输入进去,用一个 for 循环进行输入, i 等于零,为什么等于零呢?因为数组的下标从零开始嘛,所以我们 i 等于零,这里此时的 i 是 零,那这里就是给 ar 零整数,然后一直到九。这里千万不能写等号啊,因为等号的话,你就 i 可以 取十, i 能取到一十吗?取不到对不对?因为我们数组呃一共开辟了十个空间,那么它的下标最大就是九,所以只能到九,不能到一十啊,这里没有等号。 好,接下来我们就定义一个 int max 等于零啊。然后呢,我们接下来就是又便利这个数组 for int j 等于零,接小于一十。接下来讲 if, 如果说这个 a r r j 啊,它大于了 max, 那 么就让 max 等于它就行了呀,就你去找一下它里面有没有比这个 max 还要大的, 那你找到之后,你就让 max 去等于这个最大的,一直往后面去,编辑完之后呢,你就找到了最大的这个 max 了,所以我们就 print f 啊, print 把这个这个这个 max 输出出来,这个题就结束了,我们可以试一下啊,试一下吧, 比方说我们数组给个一二二三三四五五十二六 三二,有没有十个了?一二三四五六七八八个,还差两个七八。好,我们看一下结果,你看是不是五十二最大的 就出来了。好,以上呢,就是以上,就是这个 c 语言二级 c 语言的一些很简单很基础的题目,希望同学们都能够掌握,如果说视频对你有所帮助,记得点赞关注加收藏。谢谢你的支持,我们下期再见。拜拜。

嗨,大家好,如果你也写 c 语言,那肯定遇到过这种情况,一行代码看着没毛病,跑起来结果却完全不对, 查了半天发现问题竟然出在最基础的计算式上。哎,别小看这些符号,他们之间的江湖地位可是 c 语言里一个特别常见的坑。所以今天呢,咱们就来彻底搞懂 c 语言的计算式优先级,把这个 bug 的 老根给它拔了, 来,咱们不整虚的,直接上一段真实的代码,看看你是不是能一眼看穿其中的玄机,就是这行是不是看着特别眼熟, 它的作用通常就是检查一下变量, wow 里面是不是有一些特定的位被点亮了,而这些特定的位呢,就由 mask 来指定 好了。现在问题来了,你觉得计算机在读到这行代码的时候,会先算 n 的 这个谓语运算,还是先算不等于这个不等于的比较,你的第一反应是什么?嘿,先别急着下结论,这啊,藏着一个特别有意思的陷阱, 好,想好了吗?不管你刚才心里想的是什么,现在咱们就来揭晓大案,看看翻译器到底是怎么思考这个问题的。 怎么样?是不是有点意外?我们大多数人就是凭着从左到右的阅读习惯,很自然的就会认为肯定是先算 y、 o 和 mask 的 谓语嘛。但是在变易器的世界里,由于运算符优先级规则的存在,它的理解方式跟咱们的直觉那是完全反着来的。 对,你没看错,这就是问题的核心。在 c 语言的规则里,不等于这种比较计算符的地位要比按的这种谓语计算符高,所以翻译器会先去计算 mask 不 等于零这个表达式, 这个表达式的结果是什么呢?要么是一真,要么是零假,然后翻译器再拿这个一或者零去跟前面的 well 做谓语运算。你想想,这结果还能是我们想要的吗?完全不是一回事了。你可能会觉得,这谁设计的规则啊,也太反直觉了吧。 这事说来话长,它其实是个历史遗留问题。就像这个解释里说的,在 c 语言刚诞生那会儿,还没有我们现在用的逻辑与运算符 and, 那 那时候的程序员想做逻辑判断怎么办呢? 他们就直接用谓与运算符 and 来凑合。为了让 if a and b 这种写法能正常工作,设计者就必须让等于不等于这些比较运算符的优先性高,这样才能先做比较。结果呢?这个设计就这么一直流传到了今天。 刚才那个小例子,说实话,只是冰山一角。在思域元的官方标准里,运算符的优先级被划分成了整整十五个不同的等级。 那就是这张表,我的天,是不是看着就头大?先别慌,好消息时,你完全完全不需要把它背下来。说真的,没几个程序员能把这张表从头到尾背出来的。因为在实际工作中,强行去记这个不仅痛苦,而且真的没必要。 所以啊,与其去此近,应背那十五个级别。一个更聪明更实用的方法是,记住这几个大的分类和它们之间的大致顺序。一般来说,就是算数运算最大,然后是一位,再然后是关系比较,接着是位运算,最后才是逻辑运算。 记住这个大概的框架,就能帮你避开八十 percent 的 坑了,光记住大的分类还不够,咱们得来点实战。下面我们就来看一看几个因为优先性问题导致的经典踩坑案例。说不定你在别人的代码甚至是自己的代码里都见过。 你看这个表里的例子,个个都是经典。就说第三个 m s b 小 于四位加 l s b, 很多人的第一反应就是先把 m s b 做一四位,然后再跟 l s b 相加。但实际上呢,因为加法的优先级比一位要高,所以计算机会先算四加 l s b 的 和,然后再用这个和作为一位的位置。这一下代码的逻辑就全变了, 包括第二个例子也是一样,不等号的优先级比复制号等于号要高啊!还有这个 if loop index equals five 这个错误简直可以算是每个 c 语言学习者的成人礼了。我敢说屏幕前的你很可能也犯过,本来是想判断 loop index 是 不是等于五,结果少写了一个等号,变成了负值。 在 c 语言里,负值超速本身也是有值的,它的值就是负的那个数,在这里就是五。那 if of five 是 什么意思呢?对于 f 来说,只要不是零,就都是真,结果就是这个 if 条件永远都是真,结果就是这个 if 条件永远都是真的,程序就可能陷入死循环。 说了这么多陷阱,那么问题来了,我们脑子又不是电脑,记不住那么多规则,到底该怎么办才能以劳永逸的避免这些问题呢? 答案其实非常非常的简单,甚至简单到有点朴素,但他绝对是咱们今天最核心最重要的一条建议,那就是当你对优先级有任何一点不确定的时候,或者哪怕你很确定,但想让代码意图更清晰的时候,请毫不犹豫的使用括号。 括号就是你对付优先级问题的终极武器,它能消除一切的模棱两可。咱们再回到最开始的那个例子,你看,只要简单的加上一对括号,写成括号 vowel and mask, 括号不等于零,意思是不是一下子就变得清清楚楚,再也没有任何误解的可能了? 记住,多打两个括号不会让你的程序变慢,也不会花你一分钱,但它很可能会帮你省下好几个小时抓耳挠猜的调试时间。 所以这就给我们带来了一个更深层次的思考,写代码到底是为了炫耀我们懂多少晦涩的规则,还是为了尽可能清晰地表达我们的想法呢?答案我想已经不言而喻了。 好了,那今天关于四元预算员先急的深入探讨就到这里了,如果你觉得这些内容对你有所启发和帮助,请千万别忘了给我们点个赞,再点个关注,这会是我们继续做出好内容的最大动力。非常感谢你的观看,咱们下次再见!

hey, 朋友们,今天我们来聊一个 c 语言原理,你肯定见过但可能一直没搞懂的写法。它看着像个循环,但又只执行一次。它就是咱们今天的主角 do while zero。 来,说实话,你在代码里见过这玩意儿吗?一个 do while 循环条件却是零,这不就意味着他顶多跑一次吗?感觉有点多此一举对吧?但你绝对想不到,这个看起来怪怪的结构,其实是为了解决 c 元横定义里一个非常隐蔽而且极度危险的陷阱。 好,咱们不卖关子,先从这个坑说起,看看在 c 语言的多行红定义里,很多程序员甚至是一些老手都会掉进去的一个常见陷阱。 来看啊,假设咱们现在有个很简单的读行红,叫 y micro, 你 看,它的功能很简单,就是接收一个数字和一个字母串,然后用两条 print f 语句把它们打印出来。为了让这两行代码成为一个整体,我们很自然地用了一对花括号把它包起来。嗯,逻辑清晰,看着没毛病,对吧? 啊?现在我们把它用在一个再标准不过的 if else 结构里,如果数字是奇数,就调用宏打印 odd, 否则呢,就调用宏打印 even。 这代码看上去,哎,一点毛病没有是吧?感觉编运运行肯定一气呵成, 但是当我们一编辑,编辑器直接就给我们当头一棒,报了个语法错误, else 前面没有 if, 这就怪了, if 明明就在那啊,编辑器怎么就瞎了呢?别急,这个报错信息就是咱们解开整个谜题的关键线索。 行,那问题到底出在哪了呢?要搞明白这个,咱们得戴上域处理器的眼镜,看看它在背后到底对我们的代码做了什么手脚。 秘密就在这儿了,你要知道,玉兔里干的活儿,说白了就是无脑的文本替换,所以我们代码里的 my micro num odd 在 他眼里就变成了这么多,然后结束了花括号。 关键点儿来了,这个跟在花括号后面的分号,在 c 元语法里,它自己就是一条完整的语句,叫空语句。所以编辑器真正看到的是什么呢?它看到的是 if 条件成立,然后执行了一个代码块,紧接着一个分号结束了,整个 if 语句彻底结束了。那后面的 else 怎么办? 它就成了一个没有 if 配对的孤孩儿。编辑器可不就得报错吗?那怎么办呢?难道就没招了吗?当然有!这时候,咱们今天的主角就要闪亮登场了,这个看起来有点奇怪的 do while zero, 它就是来拯救这个局面的。 这个所谓的 do while 零惯用法,它的本质啊,就是用一种特别巧妙的方式,把一堆寓言言斯和缝的打包成一个在语法上独立的单一的复合语句。 你想啊, while 的 条件是零,也就是假,所以循环体里的代码百分之百只会执行一次。它既完成了我们包裹代码的目的,又完美地避开了刚才那个分号陷阱。 看,这就是用 do while zero 重写之后的样子,我们把原来的那对括号换成了 do semicolon while zero 结构。 但是请所有人注意了,这里有个最最关键的细节, while zero 的 后面我们没有加分号。我再说一遍,定义红的时候,这里绝对不能有分号,这就是整个技巧的灵魂所在。 好了,这就演出了我们这次解析最核心最关键的知识点,这个小小的分号到底该放在哪儿,直接决定了咱们的红是揍星还是灾星。咱们来做个对比,一目了然。 你看左边,这是正确写法,红定义本身不带分号,这就相当于强迫调用红的人在使用它的时候,必须像调用一个普通函数一样,在后面加上分号,这样一来,代码展开之后就变成了度写 while 的 零。 你看,这是一个语法上完美无瑕的单一的语句,跟 if、 else 配合的天衣无缝。再看右边,这个,就是典型的错误示范, 在红定义里画蛇添足底加了个分号,结果钓用者也习惯性地加上分号,展开后就出现了两个分号,度写 while 的 零,两个分号。第二个分号又成了一个空语句,直接把 if 和 else 给拆散了,又回到了我们最初的那个错误。 所以请大家一定牢牢记住这条黄金法则,在红丁异里, y 了零后面绝对不能加分号,目的就是为了让用红的人必须在调用的时候加上分号,只有这样,你的红才能表现的和普通的 c 函数调用完全一样。这既符合我们的编程直觉,又绝对安全可靠。 你以为这就完了?还没呢,都 y o 零的好处可不止这一点,这个写法还附带了好几个让你的代码更安全更健壮的赠品。 首先,它天然地创造了一个独立的局部作用域,就好像给你建了一个小黑屋,你在红里面定义的任何临时变量都不会爬到外面去污染其他代码,这就避免了很多讨厌的命名中途。 其次,你甚至可以在红的内部安全地使用 break 语句,这再写一些复杂的需要中途进行错胡检查并退出的红里,简直太有用了。总而言之,它能确保你的红无论在什么情况下行为都像一个单一的可预测的语句。 好了,说了这么多,咱们来快速的总结一下今天学到的东西,所以你今天需要带走的核心思想就是使用都哇哦灵来包裹多行红,它真不是什么奇迹引巧,更不是什么歪门邪道, 它是 c c 家家社区经过多年实践公认的一种最佳实践,是编辑安全专业可维护红代码的标准习惯。 那么除了咱们今天聊的杜望龄,在你的编程生涯中还遇到过哪些类似这样让你拍案叫绝的 c 语言小技巧呢?非常欢迎你在评论区分享出来,让大家一起开开眼界。 如果你觉得今天讲的这些对你有帮助,让你对 c 语言的理解又深了一层,那请一定不要吝啬你的点赞和关注,这样我们才能带来更深入的编程知识剖析。非常感谢你的观看,咱们下期再见!

大家好,这里是一学就会 c 语言这节课,我们先一起来认识一下什么是 c 语言。首先来看一下这节课的关键词,语言,从 c 语言这个名字当中就能看到它是一种语言, 但是这种语言是人类与计算机进行交流的语言,所以大家在后续的学习中,可以从语言的角度看待 c 语言类比人和人进行沟通,我们可以使用汉语、英语或者其他语言。人与计算机进行交流,可以使用 c 语言或者是其他计算机语言。 那么如何使用 c 语言与计算机进行交流沟通呢?这就需要技术人员编辑程序代码,告诉计算机具体执行什么任务,比如屏幕上这个例子,通过程序代码告知计算机在屏幕上打印出 hello world。 而接下来我们的学习任务就是要学习如何在 c 语言的语法格式要求下向计算机传达需要执行的任务,也就是编程。 计算机能够直接读懂这些字符吗?答案是否定的。由于计算机的工作原理,计算机只能执行零合一组成的数字指令,比如屏幕上这些由零合一组成的数字指令,在人类眼里没有任何实际意义, 但是计算机可以理解这些数字表达的含义。把这些零合一也不能无序排列,必须要按照处理器要求的固定指令格式进行排列。 那如何能够将人类能够理解的字体,也就是原代码转化成计算机能够理解的零和一呢? 这里就需要用到翻译器。翻译器本质上来说也是一种软件,它可以将我们编辑的原代码经过预处理、编译会编、链接,几个过程之后转换成计算机可以执行的程序。这样人类就可以使用易于理解的字体与计算机进行交流, 让计算机按照技术人员的意图执行相关任务。今天,我们对 c 语言有了初步认识,它是人与计算机交流的桥梁,编程能让我们下达任务,编异器则完成关键转换。 接下来,让我们正式踏上 c 语言学习之旅,用代码开启无限可能,下节课见!

大家好,这里是一学就会 c 语言这节课我们给大家讲一下 c 语言程序的基本结构。我们先来看一下这一节课的关键词记忆。对于 c 语言而言,它的程序基本结构是固定的,大家只需要把它记下来。 需要强调的是,学习 c 语言也不需要把所有的内容都背过,其实只需要记住关键结构和知识点就可以。具体用法,当我们用到的时候,可以翻阅相关的文档进行查阅,经过反复的实操应用之后,很多细节自然就能记住了。 接下来我们通过一个实例看一下 c 语言程序的基本结构。 大家先暂停一下视频,自己新建一个 c 语言文件,并将屏幕上的代码手动录入,录入的过程中要使用英文状态的符号。对于初学者而言,通过不断的编辑代码,能够快速提升自己的代码水平。 代码输入完成后,可以通过点击翻译图标检验代码输入是否有错误,如果有解决不了的问题,可以联系老师解答。现在我们假定大家已经把代码正确输入完成,我们一起来看一下这些代码包含哪些内容。首先我们可以看到多行注示, 注示的作用是用来解释或者备注代码信息,它只是用来给读者进行查看,并不参与到代码的运行当中。也就是说注示存在与否对代码的运行没有任何影响。这里多行的意思是,注示可以由一行或者是多行组成,但是它们必须由斜杠加星号 以及星号加斜杠包裹起来。所以对于多行注示而言,它的基本结构是起始字母加注示内容加结束字母,起始字母和结束字母包裹起来的内容就是注示。 注示是可有可无的,作者可以根据自己的需要进行添加。再来看一下第七行代码,单行注示。有些时候我们只需要一行简单的注示就可以,这就用到了单行注示。 单行注示使用更简单。单行注示的起始字母是两个斜杠,也就是这两个斜杠之后的内容全部是注示内容,但是中途不允许换行。 接下来看一下第八行代码引用头文件。引用头文件的目的是附用之前编辑过的代码,加快开发进度。 这里由于我们在下面的程序又用到了 print 这个函数,所以使用了 still 这个头文件。头文件根据我们实际需要进行填写,也可以同时引用多个头文件。如果不需要引入外部代码,引用头文件相关的代码就不需要写。 我们再来看一下第九行到第十二行代码。目前阶段,大家只需要记住第九行代码,第十一行代码。第十二行代码是 c 语言程序中必须要有的,每次写程序先把这三行写上, 这三行代码组成的是 main 函数的基本结构,这是 c 语言规范中标准格式。关于函数,我们会在后续的课程中再详细讲解。再强调一下,大家在写程序或者是答题的时候,首先把 main 函数基本结构写上。 main 函数作用是它是程序的运行入口,也就是说,如果我们写了几千几万行代码,那么程序还是要从 main 函数当中第一行代码开始执行, 比如这里 main 函数中的第一条代码是第十行代码,所以程序运行的时候首先会执行第十行代码。通过第十行代码,我们给大家强调一下, c 语言当中每条语句结束的时候必须要有分号,而且是英文状态下的分号,这是初学者容易犯错的地方。 好了,这就是 c 语言程序的基本结构,其中必须要存在 main 函数,也就是第九行代码、第十一行代码、第十二行代码,至于其他的内容,可以根据代码需要进行编辑。 大家可以先把 c 语言程序的基本结构记住,同时也可以按照自己的理解修改代码,尝试翻译运行。 如果遇到问题可以随时联系我,我们下节课再见!

通过这期视频,你将学会 c 元的一维数组,即讲干货,听完马上就会有我们通过讲解数值的定义,数值的输出以及最后数值的运用来熟悉这个一维数组哈。首先呢,我们来看啊,你要写 这个头文件就是 s, t, l 点 h, 然后我们主函数 int 这三个啊,来,这三个就是数值的定义,但是呢,你只选其中一个就行了。我们定义就用的最多的其实是第一个啊, 是 int a 这个东西啊,这个 a 它就是数组的名字,你可以随便取,你可以取 a, b, c, d, 什么都可以啊,用英文单词都行。呃,然后这个中括号里面有个数字,这个五表示你这个数组啊,他要存储多少个内容? 比方说我们存储五个,那就写个五就行了啊,这个是用的最多的,一定要记清楚。然后这一个呢,就是,哎,你知道你到底要存什么东西, 如果说我要就对这个数组里面我存一二三,那我这里没有必要去写个三啊,写不写都行,然后后面我就大括号,把我要存的内容给它写在里面,一二三。好。还有一种就是 int c, 然后里面 我们写上你要存储多少个,好,然后这里写个零,如果说你给的第一个元素啊,第一个空间里占的是零,那么后面它默认就是零,所以这个里面啊, c, c 的 这个三个都是零, 这两个等价啊,但是用的最多的是这一个,我们只需要记住这个其实就够了啊。好,然后我们来说数组,第一说完说数组的输入,数组怎么输入呢?我比方说我要在键盘上给一个数值里面输入它的内容,那么你需要用到 for 循环, 呃,在讲 for 循环之前啊,你还得明白一下这个数组它的一个构成吧。我们来看这个啊,这一条,这个表, 这个第一个、第二个、第三个、第四个、第五个、第六个、第七个、第八个,一共是八个格子,对吧?那我们按照正常的思维来说,正常的这个数数的这个来说啊,他第一个肯定我们数的是一, 第二个呢,第二就是二,然后第三个我们数三,它里面存的内容呢,就在格子里面哈,第一个我们存的是三,第二个存的是一,第三个我们存的是零,那么在这个 c 元里面哈,我们不从一开始数,我们从零开始数 零,第一个位置它是零,所以我们在用的时候,我们要用它的话,我们就直接就是 a 零, a 零,它表示的啊,其实就是这个里面的存储内容,就这个三,就这玩意。那么 a 一 呢? a 一 其实就是第二个位置,里面存储内容就是一 a 三啊, a 二啊, a 二是一样的, a 三也是。所以你会发现在数组里面最小的第一位,他应该是以下标,从零开始,那最高位呢?最高位应该是这个个数减一,那么如果是八个格子,他减一就变成了七, 就这样子哈,所以你要用最后一位的话,应该是 a 七,而不是说 a 八到不了 a 八,只能是 a 七,因为它从零开始,这就是数组。那么你现在啊,你要对它输入输入的话,你想一个一个输入也行啊,我们可以这样去输入,比方说你要一对一个输入,你可以 scanf, scanf, 好, 你比方说你要输入一个呃, a 零吧,你给 a 零输入哈, 输入之后呢,你就输出 print f, 好, 我们输出 by file d, 把这个 a 零对输出出来,但是呢,你会发现你一次性你只能写一个,你输入的时候你只能对一个进行输入,就就很麻烦,你要写完的话,你要全写出来 就特别麻烦。那么我们用上 four 循环,你就可以同时就是直接给很多个空间输入了,我们用 four 啊, four int i i 等于零, i 为什么等于零?因为刚刚讲了数组的下标,它从零开始,第一个位置它的下标是零,所以我们让 i 等于零啊,然后 i 小 于五, 当 i 小 于五的时候,我们进入这个循环体,然后最后我们 i 加加,此时 i 等于零,我们先 i 点零哈,进入循环体。 scf, 你 看这里 i 是 零,其实就是对 a 零进行输入, 对不对?然后呢,我们现在 i 加加 i 变成了一,一是小于五的,所以我们又进来对 a 一 进行输入,好,一直到 i 等于四的时候,四小于五,好,我们也可以对这个 a 四进行输入,然后 a 等于五的时候,哎, i 要小于五啊, i 能等于五吗?不行对不对?所以说它这里没法对 a 五进输入,因为本身也没有 a 五第五个这个位置啊,它的下标是四,所以我们只能到四,那真经过这一轮循环啊,它就把输入数字的这个输入全部都弄进去了。 接下来我们就说输出,输出呢,和这个最开始我们这里讲的一个一个的输入其实差不多,你也可以一个一个的输出你这里,你比方说你 print f 百否 d a 零,你直接输出 a 零,可以的,那你要输出 a 一, 那你就再 print f 嘛。 但如果说你想一次性把全部的输出出来呢?你还得用个 for 循环,你 for 这个,我们 int j 啊, j 等于零,因为下边从零开始,然后 j 小 于。这里我们用五吧,因为只有五个元素哈, j 小 于五,然后我建议大家就 print f, 我 们把这个 a j 给它输出出来,这就是输入,然后输出, 大概就这样子了。那现在呢?我们来说一下数字应用化,写一个小小的程序来尝试一下。比方说我们现在要先给一个数组啊, int a 还是五个人数吧。好,现在我们要输入,对不对?先输入,那就 four four int i 等于零。好,然后 i 小 于一个,多少个呀?五个,那么 i 加加, 现在呢?我们就 scf 呗, scf 百分号 d, 这里为什么百分号 d 啊?因为你数组这个前面是 int, 对 不对?你数组里面要存的就是 int 型的,你如果说你要存浮点型,你用 float, 那 你这里有百分号 f, 好, 我们给这个数组 a, 哎,好,就输入了。现在呢,我们要逆序输出,对不对?不是顺序,是刚刚那顺序就是你要否 into j, 等于你要从零开始,那你就是正序再输出,那么逆序的话,我们就从末尾这个开始呗。那我们再否 into j, 它等于多少啊?末尾那一个是多少?是不是应该是四,从四开始嘛?好,四,好,如果说这个 j 啊,它 大于多少呢?大于等于零吧,大于等于零。好,我们就 j 减减, j 减减减。 好,现在呢,我们就 print f, print f 百分号 d, 把它给输出出来,也就是 a j, 你想啊,此时的介呢,它等于四,也就是最后一个,那 j 是 大于零的,大于等于零的吧,那四大于零肯定,然后就输出了。好,三三也行,输出,然后二二也是输出,然后一一也是,我们就输出,最后零。 哎,零也是啊,那就输出,那再零减减呢?变成了负一负一,并不是它就等于零了,那就直接没有了,就结束哈。好,我们现在可以来看一下这个效果啊,看一下, 比方说我们现在输入个吧,一二二三四五回车,你看五四三二一就出来了。那你也可以给个空格啊,你这里给个空格的话,那它的效果也中间就会有个空格, 一二三四五是吧,五四三二一就出来了,你给换行也行啊,你在你,你给换行,他就直接会换行。 呃,那么这个呢,就是数组的一个最基本的运用啊,但是数组可以干很多的事。呃,就同学你在后面的学习中慢慢开发啊,这个就是带你入个门,数组的最基本的,你定义输入输出,就这样子的通过一个 for 循环。好,那么这期视频我们差不多就到这里了,如果说视频对你有所帮助,记得点赞、关注、收藏。谢谢你的支持,我们下个视频再见。拜拜。

大家好,这里是一学就会 c 语言这节课,我们先给大家做一个整体的课程介绍,跟大家说一说我们的课程设计思想。在未来的学习过程中,每一节课大概会有三个部分构成,第一点,关键词,我们为每一个知识点总结了一个关键词, 希望用这个关键词帮助大家更快地抓住课程的重点,更加便于同学们理解相关知识。 第二点,我们避免用余的 ppt 讲解,把知识点浓缩到少数 ppt 中,加快同学们的掌握速度。第三点,我们会在课程后面尽可能进行代码讲解,并且在代码演示过程中分析知识点,因为只有实操才能够真正地去掌握编程相关知识。 下面我们来看一下这节课的关键词高校,这也是我们设计这一门课的时候最关注的一个词汇。如何让大家能够快速入门,逐渐深入是设计课程的核心思想,因为时间成本才是大家学习最主要的成本,所以我们希望能够降低同学们的时间成本, 尽快达到自己的学习目标。接下来我们看一下这节课的具体内容。首先是课程目标,我们希望以最简洁的方式,用最少的时间帮助用户快速掌握 c 语言。 再来看一下哪些同学适合观看这个课程,我们列出了几类适用人群。首先呢是在校学生,我们希望可以帮助在校生能够快速的掌握 c 语言的知识点,更好地去完成自己的学业。 第二个是从业者,对于从业者而言,特别是即将入行的从业者,我们希望大家可以通过本次课程更好地应对笔试、面试以及工作中遇到的问题。 第三个是爱好者,很多科技发烧友可能希望拓展自己的技能,也可以通过我们的课程掌握 c 语言,更好地享受技术带来的快乐。 最后,我们给大家重点回答一些比较关切的问题。第一个问题, c 语言学什么?对于编程课程而言,大家学习的过程中,最重要的是锻炼自己的逻辑思维,然后提升自己的专业技能。 因为对于解决复杂工程问题而言,逻辑思维极其重要,而编程是一种很好的锻炼逻辑思维的方法。第二个问题, ai 发展这么快,还需要学编程吗?答案肯定是需要的,我们分了三点给大家做个解释。 第一点, ai 确实大大降低了编程的门槛,在后面的课程中,也会给大家介绍一下 ai 在 编程当中都起到哪些作用。但是如果想使用 ai 生成的这些代码,用户必须要具备基本的代码识读和修改能力,否则生成的代码也没有什么意义。 第二点,目前 ai 还没有办法生成较大规模的工程项目,它只能够理解比较简单的需求,而在我们的实际工作和生活当中,通常都需要满足一些较为复杂的需求,这是目前 ai 没有办法实现的,还是需要工程技术人员来进行调度设计。 第三点,对于一些特殊应用场景,比如说跟硬件交互比较多的嵌入式程序,不单纯只是编辑代码,还需要进行硬件的调试,这种调试的技能也是 ai 没有办法短时间实现的。诸如此类的因素有很多,所以依然需要开发者掌握基本的编程基础。 第三个问题,会提供答疑服务吗?我们是会提供答疑服务的,同时也会给大家提供一些测试题目进行练习,根据练习的情况进一步地提供一些答疑服务。第四个问题,如何成为一名编程高手? 这里首先要强调的就是实操,只有不断地实操练习,才能够真正地提升自己的实践动手能力。另外就是要多阅读一些优秀的代码还有书籍。第五个问题,哪里会用到 c 语言? c 语言还有必要学吗?编程技术更新非常快,会不断地有新语言涌现,但是 c 语言是一种比较特殊的语言,它是一种涉及底层编程的语言。 c 语言的执行效率还有操作硬件的特性 是目前其他语言很难与其竞争的,比如像嵌入式开发、操作系统开发、算法开发都会用到 c 语言。 好了,同学们,今天这堂课就到此结束,在今天的课程里,我们给大家做了简单的课程介绍,从下节课起,我们将正式踏入 c 语言的奇妙世界。 c 语言作为一门经典且应用广泛的编程语言,无论是开发操作系统、编辑游戏,还是进行侵入式系统开发,都离不开它的身影。希望大家调整好状态,以饱满的热情迎接下阶段的学习,相信大家定能在 c 语言的学习中收获颇丰。

hello, 小 伙伴们大家好,我是陈星,在上期视频呢,我们已经将指真的剩余的知识都看完了,本期视频呢,我们就接着往后看,看什么呢?看函数, 函数,其实我们从第一期视频我们其实就开始接触函数,所以说大家对函数肯定不陌生了,嗯,这边呢,就系统的把函数一些知识点什么东西过一遍就好, 然后后面我们就去讲细讲关键字啊,关键字讲完还有什么?还有文件,文件,然后还有预处理,预处理完了之后呢,我们就把就是讲一些 c 语言的进阶的句子, 有时间就讲,没时间就算了。好吧,因为我也马上要开学了,好吧,还有六天五天,所以说得抓紧啊。 ok, 我 们来看函数的基础语法, 第一个呢,函数的三要素,哪三要素?函数名,函数名, 还有什么函数形态, 还有什么?函数返回值,对不对?第二个,函数的使用形式, 首先我们得声明一个函数,函数的声明呢,就是注意什么呢?在调用函数前啊, 注意声明函数 又得知道啊函数的定义, 那我们函数调用 对不对?首先我们得看函数的分名,第一个呢就是函数名, 看什么函数的返回值,看什么函数那个形象的类型,形象的类型变量名可以不提供, 就是什么不分配 内存空间对不对?函数的定义 也算把函数名二是把函数返回值 形态的类型及变量名, 这一个叫函数调用,这叫什么函数名? 还有什么实参的变量 零或者实参的 d 对 不对? ok, 接下来有个这样的东西,就是函数 函数名呢,你肯定也命名,命名有规范的命名规范 啊,没有规范啊,命名叫要什么?命名要体现四注射器, 你不能什么函数都叫什么? 不能每一个函数都叫那个什么 function, function function, 对 不对?你肯定要改一下它的那个字母,就比如说你写那个,呃,之前写那个叫什么? 写输出那个素数,我们用的是 prime, 对 不对?字?注四, 注四 c, 提高代码可读性 代码可读性,现在我们写这个你得要提高代码可读性,一般都是什么动词 加名词。 第二个函数形参,函数形参呢?就是什么?呃,传什么类型,要用什么类型的变量来接传, 这样吧,传什么类型要用什么类型的 b n 基, 对不对?就比如 a 啊,住点 还有什么 a a, 那 就你可以什么 int a 符号应该数字,对吧?是什么? a a a 等于什么? int a a, 对 不对?你别到最后这个,你传什么类型都不知道用什么这个传的这个类型都不知道用什么类型编来。接 下一个就是函数的返回值,函数的返回值,第一个呢就是 return 零 减数当减函数,还有就是 e x i t 一, 对不对? return 零,前面有个零 x i t 一 就是,这就是什么?结束,整个结束,整个以上呢就是函数的一些基础语法。第二个我们要看的呢是什么 函数的注意事项, 一个就是传值和传指, 传指值 不要误认为 i 转 e。 第一个函数的形差 转值 v s 转值 转 d 值。 就比如我们可以举个例子,例如 调用函数实现,我们写一个代码,调用函数实现交换两个数的, 对不对? 这个什么时差和行差到底是什么呢?大家应该知道 名签和形签,这个形签,嗯,不知道你们大家知不知道?嗯, 名签,就比如嗯, in 的 方式,这儿 c, n, a 形签就是什么 方是 c, 然后这里面 a 这个里面是实参,这个 a 是 实参,这个里面的 a 是 形参,这个这个里面是形参。 然后接下来我们要写一个这样函数,实现交换两个数的结果, ok, 我 们来上代码, 怎么写呢?嗯,首先我们得定义一个函数, 不用,我们 int a 等于五, int b 等于二,然后 three n a 等于四,根号 d, b 等于根号 a, b, 然后调用我们的函数, 嗯, swift, 然后再打印我们的群, 然后我们要做的什么呢?就是写这个函数,这个函数呢,我们就 void 空 swift, int int, ok, 我 们可以来试一下。嗯,我们就用第三个变量吧。 in the temp 等于 a, a 等于 b, b temp, ok, 我 们来看一下能不能实现啊? g, a, c 这样子的二十五点, c 看见没? a 等于五, b 点二, a 等于五, b 点二,没有变啊,看见没? 它这个是没有变的。为什么没有变?你一定要分清啊,它传的什么?它传的是什么东西?它传的是一个纸样,所以说它不会变的,对不对? 我们得传纸的编号的地址才可以修改这个纸,对不对? 我们得查他的地址才行,是不是?所以说这样是不行的, 这个不行,嗯,这个就典型的那个, 这个是不行的, 不行, 因为这个传的是纸,传的是纸,我们得传地址才行。如何来做呢? insert 新 a, 然后呢? insert 新 b, insert 新 tab, 那 这边调用键调用什么? 举例者, a, 呃,不对,不对,对不对? a 上面还有这个,然后这边就就应该什么 e 的, 对不对?我们来看一下结果, b 等于新 cap, 新,新准时新, a 前上的那个新, ok, 看一下。 然后呀, int 型 temp, 什么 int 型 temp 型有新 a, ok, 看见没? a 等于五, b 等于二,这样就写对,所以说呢,船值和船只一定要分清, 这呢,它传的才是地址,这是可行的, 可行,知道吧?所以说我们得知道它传值还是传值,传值呢?它传的是时差的一个变量名,传地址呢?又得传时差的那个一个, 呃,变量的一个地址,知道吧?所以说这个大家得分清, ok, 嗯,这个就是。以上就是本期内容视频,下期视频我们再来做整理。 这边大家都也知道函数的三要素是哪三要素?函数名函数,现在函数返回值,对不对?这个也知道, 这个产量也得知道,反位置,这两个也得知道,型单和型单得区分, ok, 本期视频呢,就到这里,小伙伴有什么问题的话可以在评论区留言,或者点我主页的一个群。