思想:自顶向下,逐步求精
控制流:顺序、选择、重复,不允许随意出现goto语句。消除goto语句后,程序的表达能力不变
组成 = Data structure + algorithm

  1. Built in data type:char int float double
  2. 计算控制
  3. 组织 function
  4. 构造数据类型:array struct union pointer

Data

Use const whenever possible

数据类型

int x = 8;
组成:

  1. 性质:变量、常量
  2. 地址—需要touch硬件。simula 67 把所有的数据都放入heap中,造成了效率缓慢
  3. ADT:抽象数据类型–在计算机中,任何一个数据都是有限的、可数的、离散的。数据类型决定了值集 16位(-32768~32767)

Data type 定义了值集和**同类型计算的语义 **例如int+double,是通过数据类型的转换实现的
类型系统:

  1. 强类型语言、弱类型语言:体现对数据类型的容忍度的强弱,是否宽松。弱类型更灵活,但负载更大、问题更多
  2. 动态语言、静态语言:在compiler+linker阶段可以确定,则是静态类型,要运行阶段确定则是动态类型(例如实现多态时,只有在实际运行时调用,才能确定具体的数据类型,但是需要满足一定的约束)。 C++:强类型、动/静结合 类型安全不能代替测试
  3. 更加灵活的语言类型:duck

image.png
都有quack()则可以调用,不一定需要父子类关系

表达式

  1. 要考虑优先级、结合性
  2. 类型转换约定:混合类型转换(int可以转换为double) **逐个、趋强 **
  3. 求值次序:取决于compiler(副作用:破坏可移植性,降低可读性,一定要消除)

表达式越清晰越好,副作用的产生没有任何好处。表达式效率由compiler决定

  1. 谨防overflow
  2. auto:由编译器推理出数据的类型,表达更加灵活(新引入的机制)

种类:

  • 赋值:x=8 是表达式 x=8; 是表达式语句 目的:使语言更灵活,使得操作符可重载

左值:可以出现在赋值表达式左部的表达式,具有存放数据的确定地址。不一定是变量,例如函数(返回reference)
类型不同时,先计算右值表达式的值,再转换为左值类型,然后赋值

  • 逗号

image.png

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

image.png
SSA:static single assignment 处理中间码-异或操作

语句

表达式语句

表达式+分号:方便进行操作符的重载,给语言带来很大的灵活性

IO语句

封装在库,剥离开来

  • cin、cout iostream iostream.h
  • 、<<可重载

控制流语句

顺序、选择、重复

  • for:循环三要素:循环变量初始化、终止条件、改变循环控制变量。for将该三要素放在一起,方便更清晰地看清循环
  • switch+整型表达式;case:整型常量表达式(在编译之时就知道值)。只用一次比较就可以跳转到其他地方,比if语句减少了许多比较的消耗。brake记得使用。**尽量避免用字面常量,该用符号常量或者enum枚举类型 **

符号常量 const int RED = 0;
image.png
代码结构非常一致:利用枚举和表的形式。同时表可以存储在外部文件(资源文件)中,不需要放置在源代码中
image.png

C++的用途

  • everywhere
  • everything
  • invisible

Zero 零开销
语言的发展和Compiler的发展紧密相关。当compiler做的比人好时,才可以将对应的语言成分添加进来。避免效率上的降低。包含了C,又实现了抽象,同时又不降低效率
Syntax - Deduct Reduce

命令式编程范式

  • 结构化程序设计:顺序、选择、循环 三种控制结构决定了整个控制流
  • 面向对象程序设计:封装、继承、多态 没有改变命令式编程范式的状态转换的思想

声明式编程范式

Select xxx form xxx when xxx无法知道某一时刻程序的状态 =>数据库管理系统(有后台系统管理支撑
风险:不可控,虽然描述简单,但无法对复杂度进行控制。

  • 函数式编程:代码简洁、易于理解、并发(不依赖时间和环境)。要求:纯函数不依赖环境,如果改变了外部环境,就会产生副作用

**但是,副作用在程序中非常有效 **

  • 逻辑程序设计

遗传程序设计 Genetic Programming

  1. 算法不依赖于数据结构的特定实现,算法可以从特定实现中抽象出来,而且效率无损
  2. ADT把实现和接口分开,不应该忽略复杂度
  3. template并不实际生成代码,类似于图纸,在编译时生成对应的数据类型。描述算法的时候不使用数据类型,但实际上运行时需要有代码,所以依靠的就是template
  4. Alexander Stepanov 设计了STL(standard template library) - > 泛型程序设计

函数式程序设计 functonal programming

结构化程序设计 Structured Programming

面向对象程序设计 Objected-oriented Programming

历史发展路径

image.png


C++是C的超集

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