1、ptr != 0 && *ptr != 0和ptr && *ptr,后者更符合C++的程序习惯。
2、表达式的计算是指执行一个或多个操作,最后产生一个结果,一般是个右值,结果的类型由操作数的类型决定。
3、对于复合表达式,从左边开始,第一个能确定结果的子表达式后面的子表达式不被计算。
4、如果两个操作数中有一个(或两个)为负,取模(%)的结果的符号取决于机器,移植性无法保证。
5、算数表达式的计算会导致不正确或未定义的值,即算数异常(但不会抛出实际的异常)。算数异常要归咎于算数的自然本质(比如除以0)或计算机的自然本质(比如溢出)。
6、二元关系操作符的操作数的计算顺序在标准C或C++中都是未定义的,因此计算过程必须是与顺序无关的,如:
if ( ia[index++] < ia[index] )
7、sizeof的三种形式:
- sizeof( type name )
- sizeof( object )
- sizeof object
返回值类型为size_t,是一种与及其相关的typedef定义,需要头文件
#include <cstddef>
8、sizeof在编译时刻计算,被看作是常量表达式。
9、系统为每个程序都提供了一个在程序执行时可用的内存池,被成为空闲存储区(free store)或堆(heap)。
10、new:
- int *pi = new int; //或直接初始化 int *pi = new int( 1024 );
- int *pia = new int[10];
相应的delete:
- delete pi;
- delete [] pia;
11、逗号表达式从左向右计算,结果时最右边的表达式的值。
12、大多数位操作中,符号位的处理是未定义的,因此强烈建议使用无符号类型。
13、算数转换的通用指导原则:
- 为防止精度损失,如果必要的话,类型总是被提升为较宽的类型。
- 所有含有小于整型的整值类型的算数表达式,在计算之前,其类型都会被转换成整型。
14、通过使用强制类型转换操作符,程序员关闭了C++语言的类型检查设施。
15、const_cast必须应用于常量对象,并将转换掉表达式的常量性(以及volatile对象的volatile性)。
16、static_cast用于所有类型的隐式转换,显示标出。
17、reinterpret_cast通常对于操作数的位模式执行一个比较低层次的中心解释,如:
complex *pcom;
char *pc = reinterpret_cast< chat * >( pcom ); //pc到底是什么?它对pcom那段内存怎么解释?晕~
18、旧式强制类型转换两种形式:
- type (expr);
- (type) expr;
可以用来代替标准C++中的static_cast、const_cast、reinterpret_cast。但推荐使用显示转换。