当你成为C语言的高手,那么你就很容易进入到操作系统的平台里去;当你进入到系统的平台里实际做程序时,就懂得进行调试;当你懂得调试的时候,你就会发现能轻而易举地了解整个平台的架构。这时候,计算机基本上一切都在你的掌握之中了,没有什么东西能够逃出你的手掌心。 —《编程箴言》梁肇新
概述和发展过程
概述
C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言订定了一套完整的国际标准语法,称为ANSI C,作为C语言最初的标准。
基本情况和发展过程
- 产生时间:1972-1973
- 产生地点:美国贝尔实验室
- 创始人:Dennis.M.Ritchie 和 Ken.Thompson
- 目的:改写用C写的UNIX操作系统
- 1983 ANSIC
- 1987 ANSIC 87
- 1994 C99标准–至今
优缺点
优点
- 代码量小(如金山公司的WPS内核使用C写出的)
- 速度快(如windows系统内核用C写的,外壳用C++写的;unix系统内核用C写的、linux系统用C写的;操作系统是控制硬件的;系统不能用Java来写,因为java运行速度没有C语言快,而且java没有指针就不能对硬件进行直接访问操作)
- 功能强大
缺点
- 危险性高(错误之处不容易报错、太灵活)
- 开发周期长(面向对象的特点)
- 可移植性不强(主要针对java的可移植性太强了,在任何机器上都可运行)
重要性和应用领域
重要性
- 有史以来最重要的语言
- 最重要系统软件均用C编写
- 黑客必备软件(如:早期蠕虫病毒用gets()写,后来系统改为fgets()写)
- 任何一个程序设计和开发人员必须熟练掌握的语言
- 为学习其他编程语言奠定基础
应用领域
- 系统软件开发:(windows、Linus、Unix)
- 驱动程序:(主板驱动、显卡、摄像头驱动)
- 数据库:(Oracle、Sql Server、DB2、Redis)
- 应用软件开发:办公软件(WPS)、图形图像多媒体(ACDSee、Photoshop、MediaPlayer)、嵌入式软件开发(智能手机、掌上电脑)、游戏开发(2D\3D游戏)
- C语言主要用于系统开发,软件开发一般不用C
背景知识
冯氏计算机模型
计算机:
- CPU(运算器、控制器)
- 存储设备
- 输入设备
- 输出设备
HelloWord程序的运行
编译(obj)—>链接—>exe, 点击感叹号之后,请求计算机执行exe程序,所有的软件都是在操作系统的基础上运行完成的,win2000之后所有的软件都不能直接访问电脑硬件
内存的划分
- C语言中,一般把内存划分为5个区域,分别为全局区、代码区、常量区、堆区、栈区;
- 全局区中的数据(全局变量、静态变量等)的生存期贯穿整个程序运行的过程,其空间的分配和释放均由编译器自动完成;
- 代码区就是存放程序源代码的区域;
- 常量区泳衣存放程序中定义的常量,这些常量在这个程序运行期间都不会改变,其空间的分配和释放均由编译器自动完成;
- 堆区是程序运行期间为中间数据动态分配和释放空间的内存区域,其内存的分配和释放是由程序员手动控制的;
- 栈区存放被调函数相关的数据(形参、局部变量等),函数被调用时分配空间,调用完毕后自动释放内存空间;
数据类型
基本数据类型
- 整形–int–(四个字节,一个字节占八位)
- 短整型–shot int–(两个字节)
- 长整形–long int–(八个字节)
- 浮点数
单精度浮点数--float--(四个字节)
双精度浮点数--double--(八个字节)
字符类型 (单个字符char、字符串)
复合数据类型
结构体
枚举
共用体(基本被淘汰)
变量
int i;
i=3;
3最终是存放在内存中,程序终止之后3所占的空间被释放出来,放在内存中,什么位置不知道,反正是放在之前空闲的内存条中了,i与内存条中的那个空闲单元相对应。变量的本质就是内存中的一段空间。系统执行的时候,VC++6.0软件向操作系统发出请求,操作系统为变量分配内存空间。
变量使用前必须初始化,变量i(对应内存条空间),若i没有初始化,i的值可能是以前这个内存空间存放的,随机值或者系统会自动存放一个以8开头的很大的值,可以提醒程序员没有初始化。
软件运行与内存的关系:
1、软件在运行前需要向操作系统申请存储空间,在内存空间足够时,操作系统将分配一段内存空间并将外存中软件拷贝一份存入该内存空间中,并启动该软件的运行!(如放一部电影)
2、在软件运行期间,该软件所占内存空间不再分配给其他软件。
3、当软件运行完毕,操作系统将收回该内存空间(注意:操作系统并不清空该内存空间中遗留下来的数据),以便再次分配给其他软件使用。
综上所述,一个软件所分配到的空间中极可能存放着以前其他软件使用过的残留数据,这些数据被称为垃圾数据。所以通常情况下我们为一个变量或一个数组,分配好存储空间之后都要对该内存空间初始化!
只读常量和符号常量
//只读常量
const int a=10;
//符号常量(所有出现pi的地方均被替换为3.14)
# define pi 3.14
格式控制符
%d 十进制
%o 八进制
%x 十六进制
%u 无符号十进制
%f 实数(小数形式)
%e 实数(指数形式)
%c 单个字符
%s 字符串
进制、字符、字节
十进制就是逢十进一,二进制就是逢二进一;N进制是逢N进一;
在数字后面加B表示二进制;
O表示八进制;D表示十进制数,H表示十六进制数
如:
1011B=(1011)2
1357O=(1357)8
2049D=(2049)10
3FB9H=(3FB9)16
%d表示以十进制输入或输出
%o以八进制输入输出
%x表示以十六进制输入输出
常量在C语言中的表示:
十进制:传统写法
十六进制:前面加0x或0X
八进制:前面加0(注意是数字零)
浮点数:Double x= 123.45e-2;//x的值是1.2345
Float x =3.2;
Float x =123.45e-2f;
字符:按个字符用单引号括起来
字符串用双引号括起来
‘A’表示字符A
“AB”表示字符串AB
“A”表示’A’和’\0’的组合
字节:
内存条上一个格子是一位,8位组成一个字节,字节就是存储数据的单位,并且是硬件所能访问的最小单位;
一个字节包含8位,但硬件不能控制到位,但能够控制到字节;要想控制字节,要通过位运算符来实现。
int - 4个字节
long - 8
char - 1
1 byte= 8 b
1 K = 1024 byte
1M =1024K
1G = 1024M
1T = 1024G
ASCII
%c可以把字符变量输出
ASCII码不是一个值,而是一种规定,规定了不同的字符用哪个整数值表示的问题。字符的存储本质上与整数的存储方式是相同的。
‘A’——65
‘B’——66
‘a’——97
‘b’——98
‘0’——48
……
基本的输入和输出函数的用法
printf()的四种用法:
1、printf(“字符串\n”);\\如printf(“哈哈!\n”);
2、printf(“输出控制符”,输出参数);\\r如printf(“%o\n”,i);
3、printf(“%d %d\n”,j,k);
4、printf(“输出控制符 非输出控制符”,输出参数);
输出控制符
%d,——int
%ld,——long int
%f,——float
%lf,——double
%x(或者%X或者%#X),——int,long int 或 short int
%o,——int,long int 或 short int
%c,——char
%s——字符串输出
printf(“%x\n”,x);//输出结果是2f,假设x是47
printf(“%X\n”,x);//输出结果是2F
printf(“%#x\n”,x);//输出结果是0x2f
printf(“%#X\n”,x);//输出结果是0X2F//推荐使用
scanf()的两种用法:
用法一:
scanf(“%d %d”, &i, &j );//最好用空格而不用逗号,用逗号的话,输入时必须键入逗号;
用法二:
scanf(“i=%d”,&i);//键盘输入时必须键入“i=”和要输入的数字,一般不用这种用法。用scanf时最好不要输入非控制符!
如何用scanf写出高质量的程序?
1、写scanf之前,前面最好加一个printf提示信息!
2、最好不用,或者\n等,使用空格即可
3、必要时,最好将前面的赋值释放
4、编写代码时,应该对用户的非法输入做适当的处理
char ch;
while((ch = getchar()) !=’\n’)
continue;
运算符
算数运算符:+ - * / %(取余)
关系运算符:> >=< <= !=(不等于) ==(等于 )
逻辑运算符:||&& !
赋值运算符:= += -= /=*=
有限级别:
算数 > 关系 > 逻辑 > 赋值
前自增 --i ++i
后自增 i-- i++
三目运算符: A ? B : C
除法的运算结果和运算对象的数据类型有关,两个数都是int,则商就是int,若有小数,则截取小数部分;被除数和除数中只要有一个或两个都是浮点型数据,则商也是浮点型数据,不截取小数部分。
16/5==3 16/5.0==3.20000 -13/4==-4
取余的运算对象必须是整数,结果是整出后的余数,其余数的符号与被除数相同
13 % 3 == 1 13 % -3 == 1 -13 % 3 == -1
&&左边的表达式为假,右边的表达式肯定不会执行!
||左边的表达式为真,右边的表达式肯定不执行!
参考书籍:
《C语言程序设计》清华 谭浩强
《The C programminglangguage》机械工业
《C Primer Plus》人民邮电
《C和指针》人民邮电
《C专家编程》绝版
《C陷阱语缺陷》人民邮电
《C科学与艺术》机械工业
《汇编语言–王爽》