Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1816970
  • 博文数量: 496
  • 博客积分: 12043
  • 博客等级: 上将
  • 技术积分: 4778
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-27 14:26
文章分类

全部博文(496)

文章存档

2014年(8)

2013年(4)

2012年(181)

2011年(303)

2010年(3)

分类: 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]比较大小。一定不要写这样的代码

注意:不要对浮点数做=关系的比较!(有空分析具体原因)

赋值操作符

  1. int ival, jval;

  2. ival =jval = 0;//正确

  3. int ival; int* jval;

  4. ival =jval = 0;//错误两值可以分别赋0,但因两者类型不同,是不合法的。

  5. int ival = jval = 0;//有时合法有时不合法,不要这样写。

sizeof操作符

返回类型或对象的字节长度,有以下三种形式:

sizeof(type name );

sizeof(object );

sizeof  object;

返回值类型为size_t,这是与机器相关的typedef定义。如下:

  1. int a[] = {0, 1, 2};

  2. size_t s = sizeof a;//返回整个数组的大小---唯一的特例

  3. size_t leng = s / sizeof(int);

  4. int* pi= new int[3];

  5. size_t pointer_size = sizeof(pi);//返回指针长度,而不是数组长度

sizeof操作符在编译的时候计算,因此可以被看作常量表达式

new delete表达式

系统为每个程序提供了一个在程序执行时可用的内存池。它被称为程序的空闲存储区(freestore)或堆(heap)

逗号操作符

逗号表达式是一系列由逗号分开的表达式。这些表达式从左向右计算,逗号表达式的结果是最右边表达式的值。

类型转换

自动转换--算术类型转换,有如下两个原则:

为防止精度损失,如果必要的话类型总是被提升为较宽的类型。

所有含有小于整型的有序类型的算术表达式,在计算之前其类型(如:char)都会被转换成整型。

强制类型转换

强制类型转换操作符:static_castdynamic_castconst_castreinterpret_cast

旧式的强制转换用()实现,如double a= (double)intvalue;

用法如:static_cast (obj)

const_cast 表示将转换掉表达式的常量性,试图用其他三种形式来转换掉常量性,会引起编译错误。类似地,用const_cast来执行一般的类型转换也会引起编译错误。

编译器隐式执行的任何类型转换都可以由static_cast 显式完成。

reinterpre_cast通常对于操作数的位模式执行一个比较低层次的重新解释,它的正确性很大程度上依赖于程序员的主动管理。

dynamic_cast支持在运行时刻识别由指针或引用指向的类对象。

阅读(495) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~