哈喽,同行人你好!
C语言是计科类专业必学的基础课程,有道是C生万物嘛。
一、对C语言的背景了解及其延申,让你成为同学眼中的“小高人”
首先要了解一个概念,C语言是编译型语言,需要使用编译器转换成计算机可以执行的机器语言、起到一个翻译功能。
第一个三板斧来了
大家说起计算机语言都绕不开C语言。那么,怎么一开头就是C呢,是因为和电脑接轨吗?C语言是对C盘操作的语言吗?
那当然不是啦!不过还是有些相似的,C盘之前有A盘B盘,C语言之前有A语言B语言。
A盘B盘分别代表了第一代和第二代的软盘驱动器,后面被光碟、usb闪存,固态硬盘等替代了,现代的电脑也就以C盘开头了。
(这里有个小细节,光碟并不是落后了淘汰了。反而是是因为成本太高了,一个好的蓝光光驱什么价,蓝光的光碟什么价。光碟技术是一直在发展的,游戏盘啊实体专辑啊。最好的蓝光光碟技术是在蓝光光碟联盟里,其中成员就有索尼。当然光碟不止蓝光一种格式,比如xbox的光碟就是微软自己的光碟格式,你能说xbox的碟不如ps的碟吗?在不同的领域数据存储的方式是不同的,同时也不能就想当然的以为后到的就比先来的好,比如咱只知道固态,就以为固态比光碟好,只是说固态更适合电脑,所以电脑拥抱了固态。不要被局限了。举个例子,企业级的重要数据存储在什么介质里?猜猜看呢!那你一定想不到是在磁带里,当然不是咱们以前英语课本里的磁带。)
话有点多了哈,抱歉抱歉。
上面提到了机器语言,它可是一系列的二进制代码组成,全是0和1。使用相当复杂,除了科研人员谁也用不了。“铛铛”为了降低难度保住头发,主要是为了技术下放,补贴点家用。汇编语言——低级语言诞生了。利用助记符,将一堆1和0的指令用一个个易于理解的符号代替。(其实对普通人还是没什么用处,上手难度只是从地府移到了奈何桥)
战争结束,一切以经济发展为主,计算机这种巨额投资的东西,要回本,就要技术下放就要降低使用难度,A语言——第一个被广泛接受和使用的高级语言之一诞生了。人的欲望是潘多拉魔盒,B语言更契合小型计算机的语言诞生。
基本没有人会介绍A语言和B语言了,但我觉得配得上提一句。A语言对计算机科学的教育和研究产生了重要的影响。B语言基于A语言开发,C语言又受了B语言极大的影响,继承了它很多的特性。
这是计算机C语言的演变,知道这些和同学聊天,他们就冒小星星啦。学了别的高级语言以后,就忘记C语言是面向过程的语言了,要好好记牢哦,说成面向对象的语言你羞不羞。还有还有不要看不起Python哈,Python1991年就诞生了,Java1995才诞生,合适的才是最好的。
二、“人设越狠,立得越稳”嘿嘿,现在我们已经是同学眼里的小高人了,这要是有些质朴的同学“天真无邪”的找你看个👀代码,看不懂是不是很尴尬。
编译器的使用这边推荐微软的VS,有学生免费版特别好用,而且看起来就很高大上。
在创建项目时(.c)代表c语言的源文件,(.cpp)代表c++的源文件。c的大多代码都是可以在c++上运行的,毕竟c++的+代表了扩展和补充。vs上创建c的文件是通过c++的路径来创建,修改文件尾缀而完成创建。(.h)为头文件,初学时不会自己创建头文件的,了解一下就好了。
现在强调一下如何运行一个C语言程序,接下来就开始让代码了解和接触丰富多彩的你。
当你在输入框敲完最后一个字符,可以直接点击运行,编译器会自动做完它该做的事,给你返回结果。但有些笨笨的编译器不行,可由于某些不可抗力你必须用它,是一件好事。你可以细细的体验一下它的产生,打不过就加入嘛。
将你想要表达的编辑完,点击编译。它开始预处理、将C语言源代码转换成机器可以执行的机器代码,如果这一步有问题它就会报错。没问题进行下一步,到了现在还不是一个可以直接运行的程序,还是一些(.obj)目标文件。然后点击链接,把他们串起来才会将目标文件链接成一个可执行文件(.exe)这个文件尾缀很熟悉吧,手机的安装包是apk,电脑是exe。
当然最重要的还是要看得懂代码,下面就有一点枯燥了嗷。
咱们逐行开始解析
代码的最上面#define(空格)一长溜字母(空格)一个数字,如果是这个情况,那大多就是编辑者对这个编译器做的一些适应和调整。(一些编译器会有自己的一些函数而非标准c的提供的函数)#define是一个预处理指令,它可以让程序员创建标识符常量和宏函数,从而提高可读性和可维护性。
#define (空格)MAX(空格)100 表示下方代码中出现得MAX都表示为100。想象一下使用场景温度墙初始是100,调整为70、60、50,直接在define后面把100修改掉就好。MAX这个是可以替换成自己想要的其它字母的。
还有一个我们常见的预处理指令#include(空格)<头文件名称>,去引用头文件。这里补充一句所有的预处理指令结束时都没有;(预处理指令一看这个名字就优先级很高的样子,所以它在代码的最上面)
头文件分为标准库头文件和用户自定义头文件。标准库头文件是将简单常用的一些操作进行统一的封装,所有人在使用这些操作的时候,都是直接调用就好。好处一眼就能看到,规范性、可读性、模块化。要是一些简单的操作都是千奇百怪的话,不仅是读取有难度,新手入门更是摸不着头脑。
一些学校里常见的头文件:
<stdio.h> 标准输入输出库,后面见到的printf、scanf在使用前都需要引用该头文件。你想使用头文件内的函数,总的打声招呼吧。
<stdlib.h>这个库,我目前只用到动态内存分配和随机数生成。
<string.h>和<math.h>字符串处理库和数学库
在这里介绍这些头文件,是为了让你看得懂那一行代码和报错发现该函数未定义时检查一下是不是使用了标准库的函数但未引用头文件。
第二个三板斧来了
上面的头文件里自定义头文件没有介绍,那是看你后面往里面添加什么了,这个先不多说。
这里有一个程序员约定俗成的一个习惯吧,标准库的头文件用尖括号引用,自定义的头文件用双引号引用。理论上是可以混用的,甚至有些老师直接说两种引用方式都一样。(我课堂上见过的)但是不是的,你乱用的话不仅会让阅读者觉得不严谨还会让人怀疑你的能力。
尖括号引用的头文件,会告诉计算机这是个标准库函数,使用时会在标准库里找这个名字,不会在当前的目录里找。如果你自定义的头文件名字和标准库的撞了,你写的就不会被启用了。要是没有匹配的,那直接结束了,你后面根据自定义头文件所编写的代码,要么报错要么结果天差地别。
双引号引用的头文件,会告诉计算机这是自定义的函数,使用时会先在当前的目录里找,找到了直接引用,找不到的话会去标准库里找。再找不到才会结束。
这也就是理论上都可以使用的原因,老师能嫌麻烦过个大体就行了,毕竟这又不是考点。但咱要是用它吃饭的话就不能太马虎,假设你日后练习时用尖括号引用自定义的头文件,报错也不说是为什么,报错大几率是在你后面的代码里,头文件那里不报错。你身心俱疲,折腾了好久,都找不到原因,在确定代码百分百没问题以后,你甚至都怀疑上了编译器。给自己的学习增加多少困扰啊
三、这里开始正式看代码,下面都是认识一下就好(大家看到这里已经厉害了,已经2800多字了。很多人前面就离开了,就剩下最后一部分了,加油加油)
每个程序都有一个主函数和若干子函数,就像一个队伍总要有一个主心骨一样。主函数是程序的入口,是程序开始执行的地方,有且只有一个主函数。其他函数可以被主函数调用或者被其他函数调用,主函数不能被调用。
main代表主函数,void main和int main表示为两种不同的返回类型。void 表示不需要返回值,int表示需要返回一个整数值,搭配return返回数值。返回零表示程序成功执行,非零表示有错误或异常
学校的书籍上是有void的主函数返回类型,证明教材太老了。在C99标准以后就明确说明了main应该返回一个int类型的值。当然在一些平台还是可以兼容void的,但是为了代码的可移植性和标准兼容性还是推荐使用int为返回类型。
一个好的编程语言,一定是会用官方标准的。1989年美国国家标准协会制定了C89,这也是C语言的第一个官方标准。次年99年国际标准化组织和国际电工委员会共同制定了C90,后面的C99、C11、C17、C23也都是C语言标准的更新和修订。
这里有个小细节。C89是美国的标准,编译器大多也是美国的,很多代码库和系统软件都是基于这个标准写的,对于美国的公司来说符合他们国家的规定就可以了,所以C99都没这么流行开更别说后面的了,但是C语言又经历了不少次的修订,这表明了对C语言改进的需求和对新技术的适应。(美国不理会国际标准的次数也不少啊)
int(空格)main(括号)
{
return(空格)0;
}
代码的编辑需要全英文,这就是一个标准的主函数了,用vs的话空格啥的不用自己操心,自动就校验好了。
该定义变量了,和主函数返回类型一样,前面冠什么类型便是什么类型。
变量名称由数字、字母、下划线组成,且不能以数字开头,严格区分大小写
数据类型分为基本数据类型和派生数据类型,先了解基本数据类型。
整型:短整型short、整形int、long长整型、long long长长整形(有符号无符号型再说)就是整数
浮点型:fioat单进度浮点数、double双精度浮点数(扩展精度浮点数再说)通俗点就是小数
字符型:char只有它一个
(还有一个布尔型再说)
int a;这个就是创建变量了,但未初始化。
int b = 2;创建并初始化
这里为什么要单拎出来呢?因为局部变量如果未初始化它的值是不确定的,现在的一些编译器它会提示你局部变量未初始化,建议初始化。
下面就是简单介绍一下最常见的一些代码语句
if(条件)
条件符合执行;
else
条件不符合执行这个;
这个特别常见的一个选择语句,else不是必须的,可以条件不符合什么也不执行
for(初始化表达式;循环条件表达式;更新表达式)
{
\\循环体
}
这个是一个循环语句,我介绍的都是比较常见且学习了以后也会常用的语句
第三个三板斧来了
这个我觉得特别重要,放到最后是因为它更偏向于是计算机的小知识。
上面说了固态硬盘,再扩展一下计算机的存储介质根据处理速度大概可以分为几类
寄存器:在cpu内部,是cpu取数据最快,也是容量最小的存储介质,32位是4个字节,64位是8个字节,只能存储对应位的整数个数或者内存地址
缓存:是位于cpu和内存之间的高速存储器,用于减少cpu对内存访问的时间。缓存方面AMD一直独领风骚,r9 7950x3d三级缓存128mb,i9 14900kf三级缓存36mb。iu的二级缓存比au的大一些。
内存:这个说得是内存条(RAM)用于存储正在运行的程序和数据(这个的大小下面说)
辅助存储器:也就是咱们说的机械硬盘和固态硬盘了,访问速度就慢了,但是容量大啊,用于长期存储数据。
外部内存:云盘什么的,这个速度就取决于网速了
虚拟内存:是利用硬盘空间模拟内存,在内存不足时,操作系统会将部分数据和程序转移到硬盘上(由于读取速度不同,虚拟内存对硬盘会用一些损伤,正常使用的话很小)
重点说一下内存
现在的主流电脑的架构还是X86架构,它最早是16位。现在已经拓展到64位了。
X64就是X86-64,X32就是X86-32。如果系统那里只有X86和X64,那么X86代表32位。
32位系统有32根地址线,有2∧32个地址
64位系统有64根地址线,有2∧64个地址线,一个字节一个地址,
32位上限是4g
64位的太大了,理论是上16EB,只是理论
一个字节就是1b,最小是比特,一字节等于八比特。
1kb千字节就是1024b,1mb兆字节就是1024kb,1gb吉字节就是1024mb,依次往上都是1024倍
gb、tb、pb、eb、zb、yb(目前最大的存储单位了)
w7早先的版本64位只支持到8g,最后最高也就支持到192g
w10家庭版最多支持128g,专业版旗舰版支持192g 11也类似
32位支持4g但是不可能用到4g,bios和缓存会占一些地址位,然后才会分配其他的地址位
服务器领域支持到2t内存
内存的大小就完全取决于操作系统版本,主板和cpu的内存控制器规格。
哇,终于说完了。最后送一个大家第一节课都会写的东西。咱们来日方长喽。
#include <stdio.h>
int main()
{
printf("你好,世界!");
return 0;
}