1、编辑源文件 .c;
2、编译成目标文件.obj;
3、连接——将目标程序和库函数及其他目标程序连接起来,生产可执行文件,文件扩展名为.exe;
2、编译成目标文件 cc-c 原文件(编译生成 .o文件)
3、连接文件 cc .o文件(连接生成可执行文件 a.out文件);
c语言的基本元素
1、符号集——C语言使用的基本符号。
2、标识符——用来标记常量、变量、函数及文件名字的字符序列。(标示符的命名规则是只能以字母和下划线开头,可以使不数字,不能使用符号和C语言中的关键字)
3、关键字——C程序规定的,具有特定含义、专门用作语言特定成分的一类标识符。ANSI推荐的C语言关键字是32个。关键字全部应该小写。
C的数据类型
数据是操作的对象,数据类型是指数据的内在表现形式。如(数据代码、存储、运算)。
1、基本类型:整型、字符型、实型。
2、构造类型:在基本类型的基础上,按照某种构成规则构造而成的类型。数组、结构体、共用体、枚举型。
3、指针类型:用于存储地址的一类数据类型。
4、空类型:
编译器根据变量的数据类型,给变量分配存储单元。
常量与变量
1、符号常量——符号常量在其作用域内不能改变,也不能被赋值。
2、变量——变量由变量名和变量值标识。
3 变量名实际上是一个符号地址,编译连接程序时给每个变量名分配一个内存地址,当程序访问变量值时,实际上是通过变量名找到相应的内存地址,从其存储单元中读取数据。
基本类型
1、整形数据在内存中的存放,是以补码形式存放的。
2、实型数据:单精度 双精度。
在内存中以指数形势存放。
若数据超过有效位,则超过C语言规定有效位的数据将被舍去,故产生误差。
3、字符型数据:用一个字节存储单元存储。即将字符的ASCII码存储到内存单元中。
用单引号括起来的一个字符。
转义字符——特殊字符常量或者控制字符常量,它们都以“\”开头。
Char、unsigned char区别:char用7位数表示,最大表示编码为127的字符;unsigned char用8位数表示,最大表示编码为255的字符。
字符数据与整型数据可以相互赋值。
字符数据可以以字符数据输出,也可以以整型数据形式输出。
4、字符串常量:C语言中,必须是用字符数组来保存字符串常量。在内存中顺序存储。
用一对双引号括起来的字符序列。
每个字符串常量结尾以一个字符\0作为结束标记。(一般由系统自动加上)。
变量
1、自动变量——在函数体内或复合语句中定义的非静态变量称为自动变量。
C语言编译时,不对自动变量赋初值。
当程序执行到自动变量的作用域时,程序才为自动变量分配空间。当定义自动变量的函数或复合语句执行结束后,程序释放自动变量的存储空间。
自动变量保存在程序的动态存储空间。
2 静态局部变量——在函数体内或复合语句中用static定义的变量称为静态局部变量。
C语言编译时,对静态局部变量赋初值。
静态局部变量存储在程序的静态存储空间。
静态局部变量在程序的整个运行期间均占用程序的静态存储空间,直到程序退出后才释放存储空间。
3、寄存器变量——用register声明的变量。
4、外部变量(全局变量)——在函数的外部定义的变量。它的作用域是从定义处开始,到本程序文件的末尾结束,在此作用域内,全局变量可以为程序的各个函数引用。
C语言编译时,对全局变量赋初值。
全局变量存储在程序的静态存储空间。
全局变量在程序的整个运行期间均占用程序的静态存储空间,直到程序退出后才释放存储空间。
注意:
(1)当引用本源文件后面定义的全局变量或引用在其他源文件中定义的全局变量是,应在引用位置前,利用extern 声明该全局变量,以告诉编译器编译时,引用的是一个外部变量,在编译器连接时,将引用的外部变量的作用域扩展到本文件extern 声明处。
(2)用static 声明的全局变量,不能被其他文件引用。
注意:
(1)变量声明分为定义性声明和引用性声明。
(2)一般把建立存储空间的声明称为变量定义,把不需要建立存储空间的声明成为变量声明。
不同类型数据间的混合运算
不同类型数据进行混合运算时,不同类型的数据要先转换成同一类型,按照类型级别由低到高(char,short—int——unsigned—long—double;float—double)的顺序进行转换。
强制类型转换——(类型名) 表达式。强制类型转换也就是将存储数据的内存单元强制转换为另一种数据类型的单元大小。即强制将存放数据的内存单元改变。
赋值时进行类型转换:将数据复制给变量时,将会将数据强制转换为要赋值变量的类型。一般短类型转换为长类型时,进行符号扩展;长类型转换为短类型时,仅赋值低位,难以保证数据的正确性。
函数的调用过程(补充)
C函数其实就是一个程序模块。
C函数在编译时,单独编译成一个指令模块,在函数模块开始处定义保护现场指令,将用到的CPU寄存器压入堆栈。在返回时定义了恢复现场指令,将堆栈数据恢复到CPU寄存器。
在调用函数时,一般利用堆栈传递输入参数;利用EAX传递输出参数,注意在函数调用完成后,要维持堆栈平衡,且函数返回输出参数在EAX中,在使用输出参数前,不要改变EAX的值。
内存分配方式有三种:
(1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
(2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
(3)从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。