前言
在整个编程领域的学习中,C语言的学习可谓是最重要的知识点之一。思想是代码的灵魂,学习C语言更多的其实是学习编程思想。我们在学习C语言的过程中,会发现C语言的要求很多,不够灵活,当我们后期使用更高级的语言之后,会觉得C语言很死板,比如在函数中定义变量必须要在所有其他语句之前,不然编译器就会报错,或者C语言的运行过程必须先编译成.o文件,然后才能构建成可执行文件;而python或者javascript这种解释型语言就可以直接被解释执行。但是正是这些死板的规范和繁琐的编码过程,可以让咱们刚接触的编程的人对编程的过程更加透彻的理解。给后期学习前后端编程,数据库,大数据开发等等打下坚实的理论基础。
本期课程将以我们实战讲课的角度出发,去汇聚整个知识点,可能会融入一些我们在工作岗位上的编码积累,架构积累等。
安装趁手的工具
这里使用的软件是C Free 标准版,这个软件在安装的过程中需要注意的点是:安装路径中不能有空格,不然程序会报无法编译的异常,这算是编程世界带给初学程序员们的第一道门槛。
写几个简单的程序练练手
比较两个数的大小
实现比较两个数的大小
要求
1、从键盘输入两个数 2、代码需要有注释
代码
#include<stdio.h> // 比较两个数的大小 int max(int a,int b){ if(a>=b){ return a; }else{ return b; } } int main(){ int a,b,mx; scanf("%d %d",&a,&b); mx = max(a,b); printf("%d和%d的最大值是%d\n",a,b,mx); return 0; }
在上面的代码中,我们需要练习在编码中打注释的习惯,一般的注释有两种,分别是单行注释和多行注释,在C语言中,单行注释是使用 //
符合,多行注释是使用 /**/
符号。
在编写条件语句时,如果条件后面跟的语句只有一行,则可以不打大括号,如果跟了多行内容体,则需要打大括号
实现获得三个数的最大值
要求:
1、从键盘输入三个整型数字 2、要求使用函数实现
代码
#include<stdio.h> // 比较三个数的大小 int mx2(int a,int b){ if(a>=b){ return a; } return b; } int mx3(int a,int b,int c){ int mxab = mx2(a,b); int ans = mx2(mxab,c); return ans; } int main(){ int a,b,c; scanf("%d %d %d",&a,&b,&c); int ans = mx3(a,b,c); printf("%d %d %d中的最大值为 %d\n",a,b,c,ans); return 0; }
在编写上面的代码时候,咱们应该注意将所有的函数放在main函数上面,如果要卸载main函数下面,必须声明式的先将函数声明放到 前面。
C语言编写结构的注意事项
跟着编写代码的时候,需要注意以下几点问题:
- 头文件的引用需要放在代码的最顶部
- 每个C语言程序中必须包含一个 main函数
- void main(){}
- int main(){return 0;}
- C语言中每一行的结尾处必须要使用分号结尾
- C语言中的引号需要使用双引号,双引号都是以一对一对的情况出现的
- 在scanf键盘输入代码中,要使用 & 加变量名来读取一个键盘输入
- 赋值语句是将右边的值赋给左边的变量,顺序不能反了
- 需要注意代码的缩进格式,缩进为4个空格或者一个tab键为一组,但是要保证整篇代码里面风格一致,要么都是4个空格缩进,要么都是使用一个tab进行缩进
- 需要养成随手保存的习惯,保存的快捷键一般是
ctrl + s
C语言中函数的组成
一个C语言中的函数往往有 响应值类型,函数名,参数列表和函数体构成,而响应值类型涉及到变量类型,变量类型将会在我们介绍语法的时候进行进一步详细的介绍。
以下面的代码为例:
// 比较两个数的大小 int max(int a,int b){ if(a>=b){ return a; }else{ return b; } }
上述代码是一个比较两个数大小的函数,这个函数的响应值类型便是 max
前面的int
,而 函数的名字则叫 max
,参数列表便是 (int a, int b)
,函数体便是
if(a>=b){ return a; }else{ return b; }
函数体
对于一个函数的函数体来说,里面的结构也是值得看一下的。首先,需要定义出这个函数所有可能会用到的变量,在C语言中,变量的定义一定要放到最前面,因为这个时候程序会进行内存的预分配,C语言无法进行动态内存分配,所以在执行了其他语句之后,无法再创建变量。
在定义了变量之后,我们就需要编写函数体,这一部分会由后面我们即将学到的 循环语句,条件判断,加减乘除或者其他函数方法构成,在后续学习语法的过程中我们会讲到。
最后,除了响应值为 void
以外的函数,都需要使用 return
语句将结果进行返回。
程序运行过程
写了这么多程序,有的同学可能会有点疑惑:C语言的程序究竟是怎么运行起来的呢?
这就不得不提到程序的执行过程了,我们先来看一个例子。
当我们在C Free 编辑器中输入了 demo.c
的程序,如果我们在windows的机器上点击编译并运行的,会发现demo.c
所在的当前目录中出现了两个新文件,分别是demo.o
和 demo.exe
文件,而当我们手动运行 demo.exe
文件的时候发现它的执行结果与我们在 C Free编辑器中点击编译并运行的执行结果是一样的。
那么,我们来详细论述一下整个编译运行的过程,首先我们在编辑器中编辑了 demo.c
文件,然后我们执行编译操作,C语言的编译器会对 demo.c
中的代码进行词法解析,语法解析和语义分析。其中词法解析和语法解析会分析程序中的词法和语法错误。那么什么是词法呢?对于一个程序语句来说,类比到我们中文里面的一个句子,其实是由一系列词语构成的,词法解析就是对程序语句按照C语言理解的方式进行分词,如果分词器无法进行分词,就会抛出编译失败,这个时候我们只需要定位到编译出错的问题所在地,找到相应的语法错误即可。当词法和语法解析完成之后,一般来说C语言编译器还会进行语义分析,即弄清楚你究竟要干些啥,编译器在编译成更低级代码的时候会根据你的编码语义意图来优化生成的更低级代码。当所有的编译操作执行完毕之后,就会生成 demo.o
编译后的文件。
然后我们在执行 链接 操作,此时操作系统和C语义编译器会将 demo.o
文件转换成 操作系统识别的可执行文件,例如在windows操作系统中就是exe文件,而在linux操作系统中通常是elf文件。然后我们直接使用 操作系统运行这些可执行文件即可,操作系统可能会使用到底层的一些库,不过这些都晕咱们编写C语言程序的同学们没有关系,是操作系统干的事儿。这里也正体现了整个编程领域中比较重要的一个思想——分层思想,也可以叫单一职责原则(设计模式)。我们只负责将代码写好,至于究竟是怎么调用运行起来的,我们不用太关心,其他部分会做好。等到我们经验足够多了,再去一探究竟。
总结一下
程序编码注意事项
- 头文件的引用需要放在代码的最顶部
- 每个C语言程序中必须包含一个 main函数
- void main(){}
- int main(){return 0;}
- C语言中每一行的结尾处必须要使用分号结尾
- C语言中的引号需要使用双引号,双引号都是以一对一对的情况出现的
- 在scanf键盘输入代码中,要使用 & 加变量名来读取一个键盘输入
- 赋值语句是将右边的值赋给左边的变量,顺序不能反了
- 需要注意代码的缩进格式,缩进为4个空格或者一个tab键为一组,但是要保证整篇代码里面风格一致,要么都是4个空格缩进,要么都是使用一个tab进行缩进
- 需要养成随手保存的习惯,保存的快捷键一般是
ctrl + s
- 如果将自定义函数放到 main函数后面,需要在最前面对该函数进行声明
C程序的构成
- 引入使用到的头文件
- 最常见的是
stdio.h
、math.h
、stdio.h
等等,后续会讲到他们分别有哪些作用
- 编写main函数
- main函数不能变换名字,有两种写法,分别是 void main或者 int main(){return 0;} 初学者可能会把return 0;忘记掉,所以可以直接使用 void main实现主函数
- 编写其余功能函数,功能函数需要放到main函数上面,如果要放到main函数下面,需要进行显示声明
- 编写的程序尽量多打注释
C语言中函数的构成
- 响应值类型
- 函数名
- 参数列表
- 函数体
- 函数体中需要把变量的定义放到最前面
- 然后在编写其他程序
- 最后要使用
return
语句进行返回
C语言程序的运行过程
C语言程序由 编辑、编译、链接、运行
四个过程注册,其中编辑过程的产物就是 .c
文件,编译过程会对 .c
文件进行词法和语法解析,并生成.o
文件,链接过程,会链接到使用的库,生成操作系统能直接执行的可执行文件,在windows中是 .exe
文件,在 linux中便是 elf文件。