第五章 表达式
1.表达式由一个或多个操作数通过操作符组合而成。
2.作用在一个操作数上的操作符成为一元操作符,如取地址操作符和解引用操作符,而二元操作符则作用于两个操作数上,如加法操作符和减法操作符。三元操作符则作用在三个操作数上。
3.对负数求模的结果不可预估
4.逻辑与(&&)和逻辑或(||)操作符总是先计算其左操作数。只有仅靠左操作数的值无法确定该逻辑表达式的结果时,才会求解其右操作数。我们常常称这种求值策略为”短路求值”。
5.~位求反,«左移,»右移,&位与,^位异或,|位或.
6.位操作符,由于系统不能确保如何处理其操作数的符号位,所以强烈建议使用unsigned整数操作数。
7.赋值操作具有右结合性。
8.
9.条件操作符的优先度很低。
10.sizeof返回一个对象或类型名的长度,返回值为size_t
对char类型sizeof操作保证得1
对引用类型做sizeof将返回存放此引用类型对象所需要得内存空间大小
对指针做sizeof返回存放指针所需要的内存大小。
对数组做sizeof操作等效于对其元素做sizeof操作的结果乘上数组元素的个数。
11.逗号操作符:表达式从左向右计算,逗号表达式的结果是其最右边表达式的值。
12.优先级:
::
. -> [] ()函数调用,类型构造
后++ 后– typeid() 强制类型转换
sizeof() 前++ 前– ~ ! - + * & ()类型转换 new delete delete[]
->* .* 指向成员操作的指针
* / %
+ -
« »
< <= > >=
== !=
&
|
&&
||
?:
= *=,/=,%= +=,-=,«=,»=,&=,|=,^=
throw
,
13.尽管现代机器的内存容量越来越大,但是自由存储区总有可能被耗尽,如果程序用完了所有可用的内存,new表达式就有可能失败,如果new表达式无法获取需要的内存空间,系统将抛出名为bad_alloc的异常。
14.如果指针指向不是用new分配的内存地址,则在该指针上使用delete是不合法的。
15.如果指针的值为0,对其做delete是合法的,但这样做没有意义。C++保证删除0值指针是安全的。
16.在delete后,p变成没有定义(指向被释放的内存),变成了悬垂指针。悬垂指针指向曾经存放对象的内存,但对象已经不存在了。悬垂指针往往导致程序错误,而且很难检测。
17.一旦删除了指针所指向的对象,立即将指针置为0,这样就非常清楚的表明指针不再指向任何对象。
18.删除动态分配内存失败称为”内存泄露”。
19.读写已删除的对象和对同一个内存空间使用两次delete表达式都会造成错误。
20.隐式类型转换(由编译器自动执行)
21.算术转换定义了一个类型转换层次,改层次规定了操作数应按什么次序转换成表达式中最宽的类型。在包含多种类型的表达式中,转换规则要确保计算值的精度。
22.无符号的转换依赖于机器。
23.指向任意数据类型的指针都可以转换为void*类型,整型数值常量0可转换为任意指针类型。
24.将istream类型转换成bool类型意味着要检验流的状态。如果最后一次读cin的尝试是成功的,则流的状态将导致类型装换为 bool类型后获得true值。
25.显式转换static_cast
,dynamic_cast
,const_cast
,reinterpret_cast
,格式为cast-name<type>(expression)
26.const_cast只能用于添加或者删除const特性。
27.编译器隐式执行的任何类型转换都可以由static_cast显式完成。
28.旧类型转换。 (type) expr
type (expr)
1
FIN 5.12/9.22