1.基本数据类型
大体可以分为整型、浮点型和字符型,此外还有枚举型等
细节:ISO C++标准中并没有明确规范每种数据类型的字节数和取值范围,他只是规定它们之间的字节数大小顺序满足如下关系:
signed/unsigned char <= unsiged short <= unsigned int <= unsigned long
具体的类型和表示范围如下:
类型名 | 字节 | 范围 |
---|---|---|
bool | 1 | false, 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 × |
double | 8 | 1.7 × |
long double | 8 | 1.7 × |
- 32位处理器通常将short和int都用4个字节表示,64处理器通常将int和long分别于4个字节和8个字节表示。
- signed表示有符号位,unsigned表示无符号位,short、int、long类型默认情况均为signed。
- 两种浮点数除了取值范围有所不同之外,精度也有所不同,float可以保存7位有效数字,double可以保留15位有效数字。
2.常量
在整个程序运行过程中其值都始终不改变的量。
(1)整型常量:十进制、八进制、十六进制等。
整型常量可以用后缀字母L(或l)表示长整型,后缀字母U(或u)表示无符号型,也可以同时使用后缀L和U(大小写无关)
(2)实型常量:一般形式和指数形式。
如:-3,12.3,1e5,1E-3。但 E-3是不合法的,前面必须有实数。
(3)字符常量:用单括号括起来的一个字符。
C++预定义的转义字符:
字符常量形式 | ASCLL(十六进制码) | 含义 | 字符常量形式 | ASCLL(十六进制码) | 含义 |
---|---|---|---|---|---|
\a | 07 | 响铃 | \r | 0D | 回车 |
\n | 0A | 换行 | \v | 0C | 换页 |
\t | 09 | 水平制表符 | \\ | 5C | 字符"\" |
\v | 0B | 垂直制表符 | \" | 22 | 双引号 |
\b | 08 | 退格 | \' | 27 | 单引号 |
细节:无论是不可显示字符还是可显示字符,都可以用十六进制或八进制ASCLL码来表示,表示形式是:
\nnn 八进制形式
\xnnn 十六进制形式
(4)字符串常量:是用一对双引号括起来的字符序列。
(5)布尔常量:false or true
3.变量
在程序执行过程中其值可以变化的量, 变量是需要用名字来标志的。
(1)变量的声明和定义:变量在使用之前需要首先声明其类型和名称。
细节:声明一个变量不一定引起内存的分配,而定义一个变量意味着给变量分配内存空间。
如:
int a = 3;
double f = 3.56;
char c = 'a';
int a(3);
(2)变量的储存类型:
- auto储存类型:采用堆栈方式分配内存空间,属于暂时性储存,其储存空间可以被若干变量多次覆盖使用。
- register储存类型:存放在寄存器中。
- extern储存类型:在所有函数和程序段中可以使用。
- static储存类型:在整个程序运行期间都有效。
4.符号常量
为常量命名。
细节:符号常量在使用之前一定要先声明。
声明形式:
const 数据类型 常量名 = 常量值
#define 常量名 常量值
5.运算符与表达式
表达式的定义:
- 一个常量或者标志对象的标识符,其值是常量或者对象的值。
- 一个表达式可以用来参与其他操作,即用作其他运算符的操作数。
- 包含在括号中的表达式仍是一个表达式。
分类:
(1)算术运算符与算术表达式
C++中的算术运算符包括基本算术据运算符和自增自减运算符。由算术运算符、操作数和括号构成的表达式称为算数表达式。
- 基本算数运算符有:+,-,*,/,%。其中+,-作为正和和负号是为一元运算符,其余都为二元运算符。它们之间的相对优先级与数学中也是一致的,即先乘除、后加减、同级运算自左至右进行。
- a%b表示a被b除的余数,%的优先级与/相同。
- 注意:两个整数相除时,其结果取商的整数部分,小数部分自动舍弃,1 / 2 = 0。
- ++i与i++的区别
cout << i++; //表示cout << i; i+=1;
cout << ++i; //表示i+=1; cout << i;
(2)赋值运算与赋值表达式
带有赋值运算符的表达式称为赋值表达式。如n = n + 5;结合性从右向左。
(3)逗号运算符与逗号表达式
a = 3*5, a*4; //最终的结果为60
(4)逻辑运算与逻辑表达式
优先级相同(较高):<,<=,>,>=
优先级相同(较低):==,!=
- 逻辑运算符优先级次序:低 -> 高 || && !
- &&和||有“短路特性”,对于&&,如果前一个操作数为假,就不再执行后面的操作。对于||,如果前一个操作数为真,就不再执行后面的操作。
(5)逻辑运算符与逻辑表达式
C++中唯一一个三目运算符是(?),能实现简单的选择功能,形式为:表达式1 ?表达式2:表达式3
(6)sizeof运算符
sizeof运算符用于计算某种类型的对象在内存中所占的字节数。
(7)位运算
- 按位与(&):将操作数对应的每一位进行与操作,对应位都为1结果才为1,其余均为0。
- 按位或(|):对应位均为0结果才为0,其余均为1。
- 按位异或(^):对应位相同,则运算结果为0;对应位不同,则运算结果为1。
- 按位取反(~):将二进制的每一位进行取反。
- 移位:
左移运算<<:按照指定的位数将一个数的二进制值左移位。左移后,低位补0,移出的高位舍弃。
右移运算>>:按照指定的位数将一个数的二进制值右移位。右移后,移出的低位舍弃,如果是无符号数则高位补0;如果是有符号数,则高位补符号位或补0(不同编译器的处理不同)。
6.运算符的优先级与结合性
优先级 | 运算符 | 结合性 |
---|---|---|
1 | [],(),->,后置++,后置-- | 左->右 |
2 | 前置++,前置--,sizeof,&,*,+(正号),-(负号),~,! | 右->左 |
3 | (强制转换类型) | 右->左 |
4 | . *,-> * | 左->右 |
5 | *,/,% | 左->右 |
6 | +, - | 左->右 |
7 | <<,>> | 左->右 |
8 | <,>,<=,>= | 左->右 |
9 | ==,!= | 左->右 |
10 | & | 左->右 |
11 | ^ | 左->右 |
12 | | | 左->右 |
13 | && | 左->右 |
14 | || | 左->右 |
15 | ?: | 左->右 |
16 | =,*=,/=,%=,+=,-=,<<=,>>=,&=,^=,|= | 右->左 |
17 | , | 左->右 |
7.混合运算时的类型转换
隐含转换:将低类型数据转换为高类型数据。
char | short | int | unsigned | long | unsigned long | float | double |
- 逻辑运算符要求参与运算的操作数均为bool类型,如果为其他类型,则非0转换为true,0转换为false。
- 位运算要求操作数必须为整数,若为不同类型的整数,则会自动进行隐含转换。
- 赋值运算符要求左值与右值类型相同,若不同则会进行类型转换,但这时不再适用隐含转换的规则,而是一律将右值转成左值的类型。
显式转换:
类型说明符 (表达式) //c++风格
(类型说明符)表达式 //c语言风格
此外c++又定义了4种类型转换操作符:
static_cast dynamic_cast const_cast reinterpret_cast
8.语句
- c++的语句包括空语句、声明语句、表达式语句、选择语句、循环语句、跳转语句、复合语句、标号语句。
- 一个独立的(;)就构成一个空语句,空语句不产生任何操作。
- 表达式与语句的最大区别是:表达式可以作为另一个更复杂表达式的一部分,继续参与运算;而语句则不能。