C语言只是一门语言,和中文英文等语言是一样的,只是换了一种表达方式,其目的在于用我们理解的语言写下我们的想法,然后由编译器翻译成机器可以读懂的语言,然后机器运行得到我们想要结果。所以使用什么编辑器、编译器都不重要,重要的是理解人脑思考方式和机器思考方式的区别。但是这并不简单,需要通过日积月累的编程去体会。
每种语言都有着自己的语法,C语言也一样,大家需要遵循一个规则。
C语言起源:
1972年,贝尔实验室,丹尼斯·里奇(Dennis Ritch)和肯·汤普逊(Ken Thompson)发明了C语言用于Unix系统。
前身是B语言,汤普逊开发。
C语言4大特点:
语言特点:高效性,可移植性,灵活和强大。
编码特点:面向过程,函数调用,内存调用,结构化设计(可分割)
需要管理指针,内存分配,内存回收,要明白如何处理串,还有动态数据。
因为允许直接访问物理地址,所以风险也同时存在。(成也指针,败也指针)“想要拥有自由就必须时刻保持警惕”。
基本组成(句-段-篇)
30 * 3; //语句,需要用分号识别,像英文单词用空格隔开一样。
{30 * 3;} //段落(大括号),里面的词必须用分号隔开。
//具有隔断性,就是里层括号可以隔开外层括号;
//具有单向透视性,就像车上的黑膜,里层可以看到外层的东西,反之不可以。
f(x) = 3*x + 3 //数学函数,输入一个数进行处理后得到一个结果。
//计算机函数:
int main()
{
30 * 3;
return 0;
}
//文章 (函数):不一定要给数,也不一定有结果。函数就是对某一些数据进行处理的过程。
使用C语言的7个步骤:
1. 定义程序目标,用概念来分析问题,而不是用计算机语言。
2. 设计程序,界面、组织、目标、工期。
3. 编写代码
4. 编译,编译器也是一个程序,工作是将源代码转换为可执行代码。
5. 运行程序
6. 测试和调试程序,bug。
7. 维护和修改程序
先了解下计算机
计算机可以执行的是指令,CPU从内存取一条指令,执行一条。所以我们编写的C语言代码需要转换为指令给计算机执行,也就是二进制文件。十进制就是逢10进1,二进制就是逢2进1,计算机里面只有开和关两个状态,所以是二进制。所以计算机眼里一切都是数字。而这么多操作怎么定义,加减乘除存取等等,由CPU的寄存器定义,某一位开,表示一个操作,两位一个开一个关,又是一个操作。简而言之,计算机只认识二进制文件。
计算机可以干什么:
组成:中央处理器,随机存取内存,永久存储设备,外围设备。
CPU从内存中获取并执行下一条指令,CPU的工作区:寄存器,只能存储一个数字。
CPU能理解的指令有限,称为指令集。
计算机存储的都是数字,所有的计算机程序都必须以数字指令码来表示。
而写这些指令很复杂,而用C语言写好了再翻译成指令就方便多了。而这个翻译的过程就是编译。
C和C++都是编译型语言
编辑源程序—编译—与函数库连接—运行(编译型语言)
.c---------.obj----------.exe
解释型:shell,php,asp,jsp,javascript,python,perl,lua等
混合型:java,C#等
编辑器 + 编译器(Compiler) + 调试器(debugger) = IDE(集成开发环境(Integrated Development Environment))
编译,也就是变成二进制文件的过程。
即:输入源代码---编译器---可执行代码(二进制文件)
编译器
GUN Compiler Collection(GCC)和MinGW(Windows系统下的gcc工具)两大编译器
gcc的处理过程:
1、预处理 这个阶段用来处理所有的预处理指令。
2、编译 对预处理后的代码进行翻译工作,等到计算机所认识的格式。生成目标文件。像网站,超链接,代码之间也有链接。此时的目标文件就是没有链接的一个个网页。
3、链接 把所有的目标文间和其他必要的文件合并在一起得到最终的可执行文件。
gcc常用参数:
gcc -o 用于指定最终生成的可执行文件的名字
gcc -E 只对源文件进行预处理
gcc -c 只编译不链接
-std=c89/c99 用来指定编译所遵循的C语言标准
Linux下C语言程序的开发步骤
1、使用vi编写C语言源程序,编写完成后保存退出。
2、使用gcc<源程序文件名>对源程序进行处理得到计算机认识的可执行文件。
3、使用命令./a.out执行得到的文件。
Windows下开发步骤:
使用cl 文件名.c
然后文件名.exe直接执行
C语言结构:
/*
C语言结构:
#include //预编译器指令
int main(void) //main()总是第一个被调用的函数
statements //函数由语句组成
function a()
statements
function b()
statements
*/
C程序的结构特点
- C程序
- 源程序
- 预处理命令+全局变量声明+函数
- 函数(函数首部+函数体)
- 函数体(局部变量声明+执行语句)
- 语句分为:标号语句,复合语句,表达式语句,选择语句,迭代语句,跳转语句。
- 函数(函数首部+函数体)
- 预处理命令+全局变量声明+函数
- 源程序
函数(function)组成
- 函数名(function name):不能一样,区分大小写。从main开始执行,所以必须有一个main主函数,不然系统不知道从哪里开始。
- 形参列表(parameter list):需要处理的数据,允许为空。
- 返回类型(return type):处理完的结果。只能有一个。(人和人不一样,数和数也不一样,数据类型。类型不仅定义了数据的内容,还定义了这类数据可以进行的运算。)
- 用return确定返回值,关键字(C语言中具有特殊意义的单词,全部小写)。return后面的语句不执行了。
- 大多数系统中,main的返回值用来指示状态,0表示成功,非0通常用来指出错误类型。
- 函数体(function body):用花括号括起来的语句块。
函数简介:
- 函数总共出现了三次:声明原型,定义,调用。
- 何时调用butler取决于它在主函数的位置,而不是定义的位置。
- 如果定义在调用的前面,可以省略声明。但是建议使用上文的顺序,因为方便查询和使用。
- 无论main放在哪里,都是从main开始执行。
预处理指令
以#开头的语句。表示从其他文件中读取内容替换掉这一行。
<>表示文件应该从系统中规定好的位置寻找。
""表示文件应该从当前源文件所在目录开始找起。
.h文件代表头文件。
标准库(standard library),系统为你准备好的工具,可以直接拿来用。
注释
为了方便自己和他人,一定注意多写注释,方便理清逻辑和了解命名的意思。
/*这个叫段注释,也叫块注释 */
//这个叫行注释
段注释不能嵌套
行注释可以屏蔽掉段注释。
注意行注释和换行符一起的情况。
C语言语句组成:
数据 + 运算符 + 标识符 + 关键字 = 语句
语句分为:标号语句,复合语句,表达式语句,选择语句,迭代语句,跳转语句。
C语言的书写规范
- 一行内尽量放置一条语句,超长的语句可以放在多行内。
- 在合适的地方使用空格提高可读性。
- 被同一个大括号包含的语句要左对齐,被不同大括号包含的语句要用缩进区分开。
- 联系不紧密的语句之间可以使用空格隔开。
- 标识符:
小驼峰,XiAn,windows平台
下划线,xi_an,Linux平台
错误类型:
语法错误,语义错误。
调试方法:
1.自己模拟计算机运行。
2.打印调试。
3.断点调试。
//总结:
//#include
#include
//以#号开头的称为预处理命令(preprocessor directive),作用是包含stdio.h这个头文件
//<>表示从系统位置开始找,""从当前源文件所在的目录找。
//标准库(standard library)
int main()//主函数,开始和结束的地方
{
int num;
//int表示类型,是关键字(Keyword);num是变量名,是标识符(identifier)的一种。
//这句表示声明一个叫num的变量。所有变量都要先声明再使用。
//C99和C11和C++一样,声明只要在使用前就行了。以前的C标准是必须把所有变量都定义在最开始的地方。
//标识符由数字、字母(大小写)、下划线组成,数字不能开头。
num = 1;//赋值。
//声明为变量创建和标记存储空间,未初始化则里面的值是随机的。
int num2 = 2; //声明时赋值,叫初始化(initialize)。
printf("Hello World世界!num:%d\n",num);
//系统函数,格式化输出
//括号里的是实际参数(actual argument),声明该函数的地方用的参数叫形式参数。
//函数执行后,控制权给主调函数,也就是这个main函数。
//\n表示换行符(newline character),是一种转义序列(escape sequence)。
//%d表示占位符,用于指出输出num的位置。
//system("pause");
return 0;//返回值,一般正常返回0。返回给谁?主函数的返回值给操作系统。
}
//函数体用{}括起来,每条语句;结束
/********注释*********
*这个叫段注释,也叫块注释
// 这个叫行注释
*
*段注释不能嵌套
*行注释可以屏蔽掉段注释
*注意行注释和换行符一起的情况
*****************/
//为何不内置输入输出:因为不是所有程序都需要输出。
/*****************
*先声明变量再使用的理由:
*把变量都定义在一个地方,方便读者查找和理解程序的用途。
*声明变量会促使你在编写程序之前做一些计划。
*有助于发现程序中的小错误,比如变量名拼写错误。
*****************/