分类: C/C++
2011-06-07 08:52:59
第四章 表达式 算术操作符 %取余操作:只能应用在整数上,而且如果有一个或两个操作数为负数,那么余数符号取决于机器。 算术表达式的计算会导致不正确或未定义的值,这种情况叫算术异常。比如:除0,溢出。 数据溢出后产生一个未定义的结果,不同硬件会有不同结果。如:有些会置0。 浮点数运算精度问题:由于会发生浮点舍入,浮点数运算结果精度会受影响。 关系操作符 二元操作符,如>、=、<。此种表达式操作数的计算顺序是未定义的,从左到右,从右到左都可能。如下: int i = 0; if ( ia[i++]< ia[i] )//这种表达式是很危险的,认为操作数是先算左再算右边,所以预期是比较ia[0]和ia[1]的大小。但是实际很可能是从右到左计算的,于是表达式为ia[0]和ia[0]比较大小。一定不要写这样的代码! 注意:不要对浮点数做=关系的比较!(有空分析具体原因) 赋值操作符
sizeof操作符
返回类型或对象的字节长度,有以下三种形式:
sizeof(type name );
sizeof(object );
sizeof object;
返回值类型为size_t,这是与机器相关的typedef定义。如下:
sizeof操作符在编译的时候计算,因此可以被看作常量表达式。
new delete表达式
系统为每个程序提供了一个在程序执行时可用的内存池。它被称为程序的空闲存储区(freestore)或堆(heap)。
逗号操作符
逗号表达式是一系列由逗号分开的表达式。这些表达式从左向右计算,逗号表达式的结果是最右边表达式的值。
类型转换
自动转换--算术类型转换,有如下两个原则:
1 为防止精度损失,如果必要的话类型总是被提升为较宽的类型。
2 所有含有小于整型的有序类型的算术表达式,在计算之前其类型(如:char)都会被转换成整型。
强制类型转换
强制类型转换操作符:static_cast、dynamic_cast、const_cast、reinterpret_cast。
旧式的强制转换用()实现,如double a= (double)intvalue;
用法如:static_cast
const_cast 表示将转换掉表达式的常量性,试图用其他三种形式来转换掉常量性,会引起编译错误。类似地,用const_cast来执行一般的类型转换也会引起编译错误。
编译器隐式执行的任何类型转换都可以由static_cast 显式完成。
reinterpre_cast通常对于操作数的位模式执行一个比较低层次的重新解释,它的正确性很大程度上依赖于程序员的主动管理。
dynamic_cast支持在运行时刻识别由指针或引用指向的类对象。