c++数据类型回顾
c++的基本基本类型在下表(下表中的各类型长度和取值范围以32位处理器为准)
类型名 | 长度(字节) | 取值范围 |
bool | 1 | flase,true |
char | 1 | -128~127 |
signed char | 1 | -128~127 |
unsigned char | 1 | 0~255 |
short(signed short) | 2 | -32768~32767 |
unsigned short | 2 | 0~65535 |
int(signed int) | 4 | -2147483648~2147483647 |
unsigned int | 4 | 0~4294967295 |
long(signed long) | 4 | -2147483648~2147483647- |
unsigned long | 4 | 0~4294967295 |
float | 4 | 3.4*10-38~3.4*1038 |
double | 8 | 1.7*10-308~1.7*10308 |
long double | 8 | 1.7*10-308~1.7*10308 |
其中还有一个宽字符型 ,它是由下面方式来的。
typedef short int wchar_t;
从表中可以看到,c++的基本数据类型有bool,char,int,float,double等类型。除了bool类型外,可以主要分为两大类:整数和浮点数。因为char型从本质上也可以认为是整形,长度为1,存放字符的ASCII码。其中关键词unsigned 、signed、short、long,被称为修饰符。
其中用short修饰int时,short int表示短整型,占2个字节。此时int可以省略,而long int表示长整型,占4个字节,也可以省略int。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
iso c++标准并没有明确规定每种数据类型的字节数与取值范围。不同的编译器对此会有不同的实现。面向32位的处理器通常将int和long两种数据类型用4字节表示,但一些面向64位的处理器,int用4字节表示,long用8个字节表示。因此,(unsigned)int 和unsigned long虽然在表中具有相同的取值范围,但仍然是两种不同的类型。 一般情况下,如果对一个整数所占字节数和取值范围没有特殊要求,使用(unsigned)int 型为宜,因为他具有最高的处理效率。
1、typedef 类型
可以使用 typedef 为一个已有的类型取一个新的名字。下面是使用 typedef 定义一个新类型的语法:
typedef type name
例如,下面的语句会告诉编译器,feet 是 int 的另一个名称:
typedef int feet;
现在,下面的声明是完全合法的,它创建了一个整型变量 distance:
feet distance;
2、枚举类型
枚举类型(enumeration)是C++中的一种派生数据类型,它是由用户定义的若干枚举常量的集合。如果一个变量只有几种可能的值,可以定义为枚举(enumeration)类型。所谓"枚举"是指将变量的值一一列举出来,变量的值只能在列举出来的值的范围内。
创建枚举,需要使用关键字 enum。枚举类型的一般形式为:
enum 枚举名{ 标识符[=整型常数], 标识符[=整型常数], ... 标识符[=整型常数] } 枚举变量;
如果枚举没有初始化, 即省掉"=整型常数"时, 则从第一个标识符开始。
例如,下面的代码定义了一个颜色枚举,变量 c 的类型为 color。最后,c 被赋值为 "blue"。
enum color { red, green, blue } c; c = blue;
默认情况下,第一个名称的值为 0,第二个名称的值为 1,第三个名称的值为 2,以此类推。但是,您也可以给名称赋予一个特殊的值,只需要添加一个初始值即可。例如,在下面的枚举中,green 的值为 5。
enum color { red, green=5, blue };
在这里,blue 的值为 6,因为默认情况下,每个名称都会比它前面一个名称大 1,但 red 的值依然为 0。
3、常量
常量是指在程序运行的整个过程中其值始终不可改变的量,也就是直接使用符号表示的量。其中又可分为整型常量、实型常量、字符常量、字符串常量、布尔常量。需要注意的是实型常量,其中的指数形式可以为.123E-1,12.e2,1.e-3,但不能写成e-3这种格式(e不区分大小写,且e后面的数必须为整数)
实型常量的值默认为double类型,如果有后缀如 12.3f 该数为float类型
4、变量
声明一个变量只是将变量名标识符的有关信息告述编译器,是编译器认识该标识符,但是声明并不一定引起内存的分配。而定义一个变量意味着给变量分配内存空间,用于存放对应类型的数据,变量名就是对相应内存单元的命名。在c++中,大多数情况下,变量声明也就是变量定义,只有声明外部变量时例外。
auto存储类型:采用堆栈方式分配内存空间,属于暂时性存储,其内存空间可以多次覆盖使用。
register存储类型:存放在通用寄存器中。
extern存储类型:在所有函数和程序段中都可以引用。
static存储类型:在内存中是以固定地址存放中的,在整个程序运行起间都有效。
使用const关键字来创建符号常量,常量被创建后其值就固定了,编译器将不允许修改该常量的值。
const int a = 20;
注意,应在声明时对const进行初始化,如果在声明常量时没有提供值,则该常量的值将是不确定的,且无法修改。
5、运算符
运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C++ 内置了丰富的运算符,并提供了以下类型的运算符:
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 赋值运算符
- 杂项运算符
运算符优先级
后缀 | () [] -> . ++ - - | 从左到右 |
一元 | + - ! ~ ++ - - (type)* & sizeof | 从右到左 |
乘除 | * / % | 从左到右 |
加减 | + - | 从左到右 |
移位 | << >> | 从左到右 |
关系 | < <= > >= | 从左到右 |
相等 | == != | 从左到右 |
位与 AND | & | 从左到右 |
位异或 XOR | ^ | 从左到右 |
位或 OR | | | 从左到右 |
逻辑与 AND | && | 从左到右 |
逻辑或 OR | || | 从左到右 |
条件 | ?: | 从右到左 |
赋值 | = += -= *= /= %=>>= <<= &= ^= |= | 从右到左 |
逗号 | , | 从左到右 |
--摘自《C语言程序设计实用问答》
问题:如何记住运算符的15种优先级和结合性?
解答:C语言中运算符种类比较繁多,优先级有15种,结合性有两种。
如何记忆两种结合性和15种优先级?下面讲述一种记忆方法。
结合性有两种,一种是自左至右,另一种是自右至左,大部分运算符的结合性是自左至右,只有单目运算符、三目运算符的赋值运算符的结合性自右至左。
优先级有15种。记忆方法如下:
记住一个最高的:构造类型的元素或成员以及小括号。
记住一个最低的:逗号运算符。
剩余的是一、二、三、赋值。
意思是单目、双目、三目和赋值运算符。
在诸多运算符中,又分为:
算术、关系、逻辑。
两种位操作运算符中,移位运算符在算术运算符后边,逻辑位运算符在逻辑运算符的前面。再细分如下:
算术运算符分 *,/,%高于+,-。
关系运算符中,〉,〉=,<,<=高于==,!=。
逻辑运算符中,除了逻辑求反(!)是单目外,逻辑与(&&)高于逻辑或(||)。
逻辑位运算符中,除了逻辑按位求反(~)外,按位与(&)高于按位半加(^),高于按位或(|)。
这样就将15种优先级都记住了,再将记忆方法总结如下:
去掉一个最高的,去掉一个最低的,剩下的是一、二、三、赋值。双目运算符中,顺序为算术、关系和逻辑,移位和逻辑位插入其中。