Claws Garden

C++数据类型、表达式和语句

C++概述

历史

cpp溯源:

history

C++在C的基础上,从Simula继承了类的概念,从Algol68继承了运算符重载、引用以及在任何地方声明变量的能力,从Ada中继承到了模板和命名空间的概念,并且从Ada、Clu和ML继承到了异常处理。

参考书目

基础:

效率:

原理:

语言、标准库:

设计模式:

结构化编程部分

数据类型

数据类型包括:

每一种类型应该有固定的占用数据区空间大小,可以使用sizeof(<类型名>)得到该类型一个数据占用的字节数。

typedef可以为已有的类型定义一个别名。比如typedef int INT;

表达式

表达式主要由操作符和操作数组成。对表达式进行求值的时候,需要考虑到运算的优先级、结合性、类型转换、求值次序(从左到右还是从右到左,由编译器决定)。

由于通常只会定义同类型之间的运算,因此如果出现混合运算的时候需要进行类型转换。有时候是默认的类型转换,比如int到double;有时候需要强制类型转换。

不应该写入任何可能具有歧义的表达式,优化表达式的表示没有意义。

操作符可以重载,但是不能创建,只能给大多数已经存在的操作符重载。

赋值表达式

左值表达式=右值表达式

左值:具有存放数据的确定地址,注意有些表达式的计算结果是存在寄存器中的临时值,这种不是左值,比如(a+1)。左值可以是一个变量名、表达式或函数返回值。比如++a是左值,但是a++不是左值。对于返回引用的函数来说,函数返回值也可以是左值,比如int& foo(int[] a){return a[0]}这样的函数,可以写foo(a)=8这样的赋值表达式。

当一个表达式不是左值,它就是右值。除了数组、函数、不完整类型的所有左值都可以隐式转换为右值。取地址符&接受一个左值,返回一个右值;而解引用操作符*接受一个右值返回一个左值。另外,&还可以用来定义引用类型,准确的说是左值引用,因此,不能将一个右值赋值给(非常量的)左值引用。右值可以赋值给常量引用,但是不能修改,因为强调这是一个临时的值。常见的右值比如说一个字面常量,不返回左值引用的函数返回值。

左右两边类型不同时,先计算右值表达式的值,再转换为左值这边的类型,之后赋值。

算术表达式

比较特殊的就是增量和减量操作符。

当然a也必须是左值,不然没办法让a自增。

条件运算符表达式

<exp1>?<exp2>:<exp3>先计算exp1的值,然后根据其结果选择2和3中的一个计算,整个表达式的值也是所选2或3表达式的值。2和3中只会有一个被计算。

条件三元运算符不能重载。

逗号表达式

从左到右依次计算,最后一个表达式的值作为整个表达式的值。如果最后一个表达式是左值,那么整个表达式是左值。

字位运算符表达式

把数据看成二进制数,对二进制的序列进行操作。

~取反,&与,|或,^异或。右移位»,左移位«。

语句

可分为表达式语句,IO语句,控制流语句。

控制流语句:所谓结构化程序设计就是用3种控制流结构来完成程序的流程:顺序、选择、循环。

Switch语句

switch后填入整型表达式,而case后需要填入整型常量表达式(需要编译时能确定的值),并且满足不重复。这里的值次序任意,起到标号的作用,并不改变执行的顺序,因此需要配合break语句使用。

实现:表驱动,建立一个case的索引表(case后面的值直接作为偏移量),计算switch目标的值之后直接查表,并执行后面记录的指令内容。是一种牺牲空间提高时间效率的做法。

#C++