一、绪
起源:
1972年,贝尔实验室的丹尼斯·里奇和肯·汤普逊在开发UNIX操作系统时设计了C语言。C是在B的基础上进行设计的,设计初衷是将其作为程序员使用的一种编程工具。
特性:
C语言具有通常是汇编语言才具有的微调控能力(汇编语言是为特殊的中央处理单元CPU设计的一系列内部指令,使用助记符来表示;不同的CPU系列使用不同的汇编语言),以获得最大运行速度或最有效地使用内存。
C是可移植的语言。许多计算机体系机构都可以使用C编译器(C编译器是把C代码转换成计算机内部指令的程序)。一般而言,不同CPU制造商使用的指令系统和编码格式不同,但使用合适的编译器或编译器集,便可以把一种高级语言转换成供各种不同CPU使用的机器语言程序。
计算机部件构成:
中央处理单元(CPU)承担绝大部分的运算工作。CPU有自己的小工作区——由若干个寄存器组成,每个寄存器都可以存储一个数字。一个寄存器存储下一条指令的内存地址,CPU使用该地址来获取和更新下一条指令。
随机存取内存(RAM)是存储程序和文件的工作区。
永久内存存储设备(过去一般指机械硬盘,现在还包括固态硬盘)即使在关闭计算机后,也不会丢失之前存储的程序和文件。
外围设备(如、键盘、鼠标、触摸屏、监视器)提供人与计算机之间的交互。
语言标准:
ANSI定义了C语言和C标准库。C89、C99、C11
概念:
流程:编辑源程序(xxx.c) ——> 编译器编译生成目标程序(xxx.obj/xxx.o) ——> 连接器生成可执行文件 ——> 运行可执行文件(xxx.exe/a.out)
编译器还会检查C语言程序是否有效,如果出错,就不生成可执行文件并报错。
除了编译以外,还需要从函数库中把需要的函数“连接”到目标程序中,形成操作系统能执行的可执行文件,连接由连接器完成。链接器把编译的目标代码、系统的标准启动代码(充当程序和操作系统之间的接口)和预编译的库代码这3部分合并成一个文件,即可执行文件。在大多数系统中,编译器运行链接器。
对于库代码,链接器只会把程序中要用到的库函数代码提取出来。
GUN编译器集合(也被称为GCC,其中包含GCC C编译器)。
gcc是Linux下基于命令行的C语言编译器,也是GNU最具有代表性的作品。用gcc编译程序生成可执行文件的过程不单单是一个编译过程,而且要经过预处理、编译、汇编、连接几个过程。
编程七步走:
定义程序的目标 ——> 设计程序 ——> 编写代码 ——> 编译 ——> 运行程序 ——> 测试和调试程序 ——> 维护和修改代码
二、基本概念
标识符:自定义名字
1)、标识符必须由英文字母、数字和下划线组成
2)、不能以数字开头
3)、字母区分大小写
4)、不能与关键字相同
数据类型
计算机内部采用的是二进制,如何判别01串的意思?
答:需要赋予该01串一个类型。
对象:一片内存(主存)区域。
对象类型:赋予该片内存区域中数据(01串)的含义。
C语言是强类型语言,任何对象都必须有明确的类型。
常量
常量就是一个确知的值。
1、整型常量
分为八进制、十进制、十六进制三种。
0表示八进制,如0123(等于十进制的84)
0x/OX表示十六机制,如ox124(等于十进制的292)
不加任何前缀,默认就是十进制
C的整型数据有很多种(short、long、unsigned、signed),如何判断出现的某种进制的数据究竟属于那种类型?
1)、不带任何整数后缀的十进制整数常量,按 int、unsigned int、long int、unsigned long int 的取值范围依次判定
2)、不带任何整数后缀的十六进制或八进制整数常量,按int、unsigned int、long int 或 unsigned long int 依次判定
3)、通过加后缀u/U(表示unsigned int或unsigned long int)、l/L(long int 或 unsigned long int)、或ul/uL/Ul/UL(unsigned long int)来指定整数常量的类型,
2、浮点型常量
指带有小数点或者指数部分的常量。如,1.2E+2,123.f,1e-4 (指数形式时以10为底,用e/E表示指数,指数部分必须为整数)
C89规定,浮点型常量只能用十进制。
浮点型常量的默认类型是double型。可通过后缀f/F(表示float型)、l/L(表示long double型)
3、字符常量
指用单引号括起来的一个字符或者一个转义字符序列。
说明:
C的基本运行字符集为ASCII字符集,一个char类型的变量占用一个字节的内存空间,编译时把用单引号括起来的一个字符或一个转义字符序列翻译成对应字符的ASCII码,以二进制的形式存储到分配的内存单元中。
如果单引号中的字符多于一个,一般选择取其最后一个字符。
4、字符串常量
指用双引号括起来的字符序列。
说明:
字符串以 作为结束标志,字符串中间不能含有该字符,比如 “a”,在内存中实际存放的是97和0
字符串结束标志 由编译器自动增加,程序中不用写出
变量
该标识符实际对应一块内存区域,数据存放在改内存区域中。
C的变量,必须先申明,后使用。
格式:[类型修饰符] [存储区分符] 类型区分符 变量名1[,变量名2...] ;
整型变量
对于有符号数,0代表正,1代表负
不同类型的变量占用的内存单元数不同,且与平台相关。
无符号数在计算机内部用原码表示;有符号数在计算机内用补码表示。
正整数的原码、反码和补码都一样。
负数的反码是将原码中除符号位之外的其余位依次取反。负数的补码在反码的基础上加1,符号位不发生变化。
表达式是由操作数(被操作的对象)和运算符(对对象的某种操作符号)组成的序列。
表达式也有类型,等同于计算结束后所得的类型。
位运算
位运算操作数必须是整型。
1)、位移运算
不改变原操作数的值。
右移(>>),将保持符号位不变,最低位移除;左移(<<)时低位补0,高位移除
2)、位非 ~
不改变原操作数的值。
所有位取反。
3)位与(&)、或(|)、异或(^)
不改变原操作数的值。
负数按补码形式
&:两位同时为1,才为1,否则为0
|:只要有1个为1,其值位1
^:对应位不同,结果为1,否则为0
如果操作数1和2长度不同,对较短的操作数进行整型提升。
类型转换
1)、强制类型转换
(类型)表达式
说明:
高低类型互相转换,但从高类型转到低类型可能引起精度丢失。
浮点型到整型的转换必须强制执行,只转换浮点数的整数部分,而不是四舍五入。
2)、自动类型转换
参与运算的操作数的类型可以不同,但在运算时会自动把他们转换为同一类型,然后再运算。
doublie > float > long > unsigned > int
转换的实质是,把表示范围小、精度低的数据类型转换为表示范围大、精度高的数据类型,又称类型提升。