第二课 SP
思想:自顶向下,逐步求精
控制流:顺序、选择、重复,不允许随意出现goto语句。消除goto语句后,程序的表达能力不变
组成 = Data structure + algorithm
- Built in data type:char int float double
- 计算控制
- 组织 function
- 构造数据类型:array struct union pointer
Data
Use const whenever possible
数据类型
int x = 8;
组成:
- 性质:变量、常量
- 名
- 值
- 地址—需要touch硬件。simula 67 把所有的数据都放入heap中,造成了效率缓慢
- ADT:抽象数据类型–在计算机中,任何一个数据都是有限的、可数的、离散的。数据类型决定了值集 16位(-32768~32767)
Data type 定义了值集和**同类型计算的语义 **例如int+double,是通过数据类型的转换实现的
类型系统:
- 强类型语言、弱类型语言:体现对数据类型的容忍度的强弱,是否宽松。弱类型更灵活,但负载更大、问题更多
- 动态语言、静态语言:在compiler+linker阶段可以确定,则是静态类型,要运行阶段确定则是动态类型(例如实现多态时,只有在实际运行时调用,才能确定具体的数据类型,但是需要满足一定的约束)。 C++:强类型、动/静结合 类型安全不能代替测试
- 更加灵活的语言类型:duck
都有quack()则可以调用,不一定需要父子类关系
表达式
- 要考虑优先级、结合性
- 类型转换约定:混合类型转换(int可以转换为double) **逐个、趋强 **
- 求值次序:取决于compiler(副作用:破坏可移植性,降低可读性,一定要消除)
表达式越清晰越好,副作用的产生没有任何好处。表达式效率由compiler决定
- 谨防overflow
- auto:由编译器推理出数据的类型,表达更加灵活(新引入的机制)
种类:
- 赋值:x=8 是表达式 x=8; 是表达式语句 目的:使语言更灵活,使得操作符可重载
左值:可以出现在赋值表达式左部的表达式,具有存放数据的确定地址。不一定是变量,例如函数(返回reference)
类型不同时,先计算右值表达式的值,再转换为左值类型,然后赋值
- 逗号

- 算术
- 关系和逻辑
- 条件运算符表达式:
- 唯一的三目运算符
- 只计算一个运算分量
- 不可以操作重载
- 可嵌套:就近原则
- 字位运算符表达式(用bit表示状态位)

SSA:static single assignment 处理中间码-异或操作
语句
表达式语句
表达式+分号:方便进行操作符的重载,给语言带来很大的灵活性
IO语句
封装在库,剥离开来
- cin、cout iostream iostream.h
、<<可重载
控制流语句
顺序、选择、重复
- for:循环三要素:循环变量初始化、终止条件、改变循环控制变量。for将该三要素放在一起,方便更清晰地看清循环
- switch+整型表达式;case:整型常量表达式(在编译之时就知道值)。只用一次比较就可以跳转到其他地方,比if语句减少了许多比较的消耗。brake记得使用。**尽量避免用字面常量,该用符号常量或者enum枚举类型 **
符号常量 const int RED = 0;
代码结构非常一致:利用枚举和表的形式。同时表可以存储在外部文件(资源文件)中,不需要放置在源代码中
C++的用途
- everywhere
- everything
- invisible
Zero 零开销
语言的发展和Compiler的发展紧密相关。当compiler做的比人好时,才可以将对应的语言成分添加进来。避免效率上的降低。包含了C,又实现了抽象,同时又不降低效率
Syntax - Deduct Reduce
命令式编程范式
- 结构化程序设计:顺序、选择、循环 三种控制结构决定了整个控制流
- 面向对象程序设计:封装、继承、多态 没有改变命令式编程范式的状态转换的思想
声明式编程范式
Select xxx form xxx when xxx无法知道某一时刻程序的状态 =>数据库管理系统(有后台系统管理支撑)
风险:不可控,虽然描述简单,但无法对复杂度进行控制。
- 函数式编程:代码简洁、易于理解、并发(不依赖时间和环境)。要求:纯函数:不依赖环境,如果改变了外部环境,就会产生副作用
**但是,副作用在程序中非常有效 **
- 逻辑程序设计
遗传程序设计 Genetic Programming
- 算法不依赖于数据结构的特定实现,算法可以从特定实现中抽象出来,而且效率无损
- ADT把实现和接口分开,不应该忽略复杂度
- template并不实际生成代码,类似于图纸,在编译时生成对应的数据类型。描述算法的时候不使用数据类型,但实际上运行时需要有代码,所以依靠的就是template
- Alexander Stepanov 设计了STL(standard template library) - > 泛型程序设计
函数式程序设计 functonal programming
结构化程序设计 Structured Programming
面向对象程序设计 Objected-oriented Programming
历史发展路径

C++是C的超集
C++ 支持 C 所支持的全部编程技巧
任何 C 程序都能被 C++ 用基本相同的方法编写,并具备同等开销(时间、空间)