目录
思考问题:
1、如果声明了一个变量,但是没有赋初值,那么bebug看会是个随机数,是否可直接进行输出?
2、Const常量与宏常量区别是什么?优先使用哪个比较好?其优势是什么?另外注意define常见的误区。
3、C语言基本类型分别是什么?变量的类型决定了哪四个基本特性?
一、计算机系统概述
1、计算机进程中的几个关键人物
乔布斯、比尔盖茨、冯诺依曼、图灵
2、图灵机,冯诺依曼机
输入、输出、控制器、运算器、存储器(了解计算机处理1+1=2的流程) http://zhihu.com/question/27883465/answer/93161520
3、图灵测试
看测试者有无分清此为机器还是人(比如验证码)
4、人工智能(Artificial Intelligence 简称AI)
让计算机具有执行与人类智能活动有关的复杂功能(如判断推理识别理解学习规划和问题求解)的能力
5、计算机系统
硬件系统:计算机的躯壳冯诺依曼结构,
软件系统:应用软件支撑软件操作系统
6、其他概念
机器语言: 计算机能直接读懂和执行的语言
机器代码: 机器语言编写的一组机器指令的集合
汇编语言: 可移植性低
高级语言:C、C++、Java
二、C语言概述
1、C 语言是里程碑式的语言
a. 相对低级语言在一个高的级别上进行编程,目前较多流行语言借鉴C语言,陆续衍生C++ Java,以及可以提供如Python等语言的运行环境,
b. 介入高级语言和低级语言之间的语言,运行效率高,可以开发类似浏览器等系统上的系统级应用
c. 使用C语言更好的理解内存的操作,透过C语言窥探计算机底层原理
C语言1972年贝尔实验室设计发明之父:ken与dmr 先后版本:C89、C90、C99
2、C语言适合做什么?
编写系统软件OS和工具软件
运行效率要求较高的系统
1、设备驱动程序,嵌入式系统 embedded systems
2、高性能、实时系统real-time systems
3、顺序编程流程:
1、分析
2、设计
3、编码
4、编译连接源代码翻译成与之等价的机器语言表示的目标程序把程序调用的库函数链接到目标程序中,生成可被OS执行的程序
5、运行
6、测试调试
7、维护
4、C程序的开发工具
Visual C++
Code::Blocks+GCC+GDB 没有内置编译器调试器可支持GCC编译器和GDB调试器
三、C语言的关键字与标识符
关键字keywords 32个
标识符identifiers 大小写字母数字下划线
a. 系统预定义标识符(例如printf,不建议再用,问题:能否重写)
b. 用户自定义标识符变量名数组名等
c. 命名规则:字母或下划线,见名知意,不能与关键字及系统预定义标识符一样
四、C语言程序处理的数据形式
常量(Constant)程序中不能改变其值;变量(Variable) 程序中能改变其值
变量
变量必须先定义,后使用
变量定义语句:
类型关键字 变量名 int a; keyword identifier
类型关键字 变量名1,变量名2; int a,b,c;
变量的属性
变量名标示了内存中的一个特定存储单元,内存按字节编址,用唯一的一个十六进制无符号整数来标识地址例如32位机的内存地址是32位,0x00000000到0xFFFFFFFF
编译器按变量定义的类型分配相应的大小的内存空间,例如int a 类型决定4个字节,每个字节都有内存地址,变量地址即是首地址。
属性:变量类型Type、名字Name、值Value、地址Address
数据类型
- 基本数据类型
- 整型
- 基本整型
- 长整型
- 短整型
- 无符号整型
- 实型(浮点型)
- 单精度实型
- 双精度实型
- 长双精度实型
- 字符型
- 枚举类型
- 整型
- 构造类型
- 数组类型
- 结构体类型
- 共用体类型
- 数组类型
- 指针类型
- 空类型
变量的类型决定了什么?
冯诺依曼体系中程序代码和数据都是二进制存储,对硬件来说类型是不存在
- 区分数据类型
- 更有效组织数据,规范数据的使用
- 有助于提供程序可读性
- 带来程序的简明性和数据可靠性(类型匹配检查)
- 提升执行效率和内存空间(类型声明在最前)
变量的类型所决定四大特性
1、占用内存空间的大小
- int 基本类型,目前大多数系统占用4个字节(没明确规定)
- short int,短整型,2个字节,简写short
- long int,长整型,4个字节,简写long
- unsigned,无符号整型(正整数和0)用来修饰int short 和long
- float 单精度实型 4个字节
- double双精度实型 8个字节
- long double 长双精度实型 IEEE规定10个字节,系统相关 VC++占8个
- char 字符型 1个字节
如何计算变量或类型占用内存空间大小?
用sizeof运算符,一元运算符 好处:
* 增加程序的可移植性
* 编译时执行的运算符,不会导致额外的运行时间开销
注意:sizeof是运算符不是函数!
* 用法一:Sizeof(类型) 类型占用的内存字节数
* 用法二:sizeof(a+b) sizeof(a)变量或表达式所属类型占用的内存字节数
2、数据的存储形式
- 整型数:
一个多字节的数据是如何存放在存储单元中的呢?- 高位字节低位字节
- 小端次序 便于计算机从低位字节向高位字节运算
- 大端次序 与人们从左到右书写顺序相同,便于处理字符串
- 高位字节低位字节
- 实型数:
关键:确定实型数小数点的位置。
如何表示实型数?整数部分 小数部分- 小数形式 3.1415
- 指数形式-科学计数法 3.1410 0.31410
-
定点数(Fixed Point)【小数点的位置固定】
- 定点小数(纯小数)小数点位于符号位和最高数值位之间(符号位|固定小数点|数值部分)
- 定点整数小数点位于数值位的最低位(符号位|数值部分|固定小数点)
- 浮点数(Floating Point)【小数点的位置不固定】
将实数拆分成了阶码Exponent和尾数分别存储,对于同样的尾数,阶码越大,则浮点数所表示的数值数值的绝对值越高。
阶码E(决定实数的表数范围)尾数M(小数部分)决定实数的表数精度同样4个字节(32位),定点数表数范围受其二进制位数的限制-值域是有限的
在计算机中通常用定点数来表示整数和纯小数;用浮点数表示既有整数部分又有小数部分的实数
-
字符型数据(英文字母、数字、控制字符)
以二进制编码方式存储,一个字节保存一个字符
字符编码方式,取决于计算机系统使用的字符集,ASCII字符集,每个字符有一个编码值(查ASCII码表),字符常数就是一个普通整数
3、合法的表数范围
字节数不同,表数范围可能不同,字节数相同也表数范围可能不同,如unsigned无符号数
4、可参与的运算种类
不同数据类型可参与的运算不同
* 整型
加减乘除求余
* 实型
加减乘除
* 字符型
加减(整数) 对ASCII值进行运算
常量constant
在程序中不能改变其值
包括:
* 整型(如67,022(八进制),0x12 123L 123u) 默认为int
* 实型(如3.14 1.2e-5 2.73F 2.73L) 默认为double
* 字符型(如’z’)
* 字符串(如”test”)
* 枚举型
在程序中直接使用的常数成为幻数
* 建议定义为宏常量和const常量
* 优点减少重复书写提高可读性和可维护性
宏常量Macro Constant
用一个标识符来表示的常量
宏定义: #define 标识符[一般全大写] 字符串
注意:不区分数据类型末尾不加分号的!加了分号比如”3.14;”就相当于直接替换为”3.14;”了,这里是不进行语法检查的,所以会有可能报执行错误的
编译预处理命令:#:
在源程序编译之前,先对程序中的编译预处理命令进行处理,然后将处理结果和源程序一起进行编译,以得到目标代码。
#define PI 3.14 宏展开,宏替换
存在的问题:
没有数据类型,编译器在宏替换时不进行类型检查;只进行简单的字符串替换
Const常量
定义:Const double pi= 3.14;
为什么只能在定义的时候赋初值?因为放在了内存的只读存储区
Const常量优点是什么?
有数据类型,编译器可进行语法检查;集成化调试工具可对其进行调试;
小结:
熟悉整数除法与浮点数除法,求余只能整数,根据实际情况严格查看自己的程序。
熟悉强制转换与隐式转换,熟悉其对原操作数是无变化的
增1减1运算中,根据策略进行运算,
熟悉各运算符优先级,一元运算优先级最高,熟悉根据优先级进行左结合和右结合
熟悉变量类型决定了什么?熟悉针对变量的赋值运算