第五章 表达式

第五章  表达式

一、算术操作符:

一元操作符: +/-  正负号; 优先级最高

二元操作符: *   /  % 乘、除、求余, +  -  加减号, 乘除求余高于加减

注意:两个整数相除,结果仍为整数,小数部分会被截断,21/6=3;

                   A%B ,A对B求余,则B一定为整数。

二、关系操作符和逻辑操作符:

包括: 逻辑非(!)、 小于(<)、小于等于(<=)、大于(>)、大于等于(>=),相等(==)、不等(!=)、逻辑与(&&)、逻辑或(||)

注意:关系操作符(<、>、<=、>=) 不应该串接使用,因为关系操作符返回bool类型结果。例如: if ( I < j < k ) ;  只要k大于1,表达式就为true,应该写为if ( I < j && j < k ) ;

三、位操作符:使用整型操作数,将其整型操作数视为二进制位的集合,为每一位提供检验和设置功能。

单目:位求反(~)  双目:左移(<<) 右移(>>) 位与(&) 位异或(^) 位或(|)

例子:

位求反: bits  为 10010111(二进制)     ~bits  为  01101000

左移:   bits << 1  左移一位,得   00101110

右移:   bits >> 1  右移一位,的     01001011

(移位操作的右操作数不可以是负数)

设:         b1 为 01100101

                   b2 为 10101111

那么b1 & b2为00100101(b1,b2对应位数都为1则b1&b2的对应位数才为1,否则为0)

位异或b1^b2为11001010(b1,b1对应位只有一个1时,b1^b2对应位数才为1,否则为0)

位或b1 | b2为11101111(b1,b2对应位有一个或两个1时,b1|b2对应位数为1,否则为0)

注意:位与,位异或,位或都需要两个整型操作数!

总结:位与:1对应1才得1;1-0,0-1,0-0得0;

         位异或:1-0,0-1得1; 1-1,0-0得0;

         位或:1-0,1-1,0-1 得1 ; 0-0 得0;

四、赋值操作符: “ = ”

1、赋值表达式的值是其左操作数的值,其结果的类型为左操作数的类型。

2、赋值操作具有右结合特性: ival = jval = 0; (都是0)

3、赋值操作符的优先级低于不等操作符: if( (i=get_value() ) != 42 ) 其中赋值操作必须加上括号。

4、复合赋值操作:+=, -=, *=, /=, %=, <<=,  >>=, &=, ^=, |=

五、自增和自减操作符

1、自增操作的优先级高于解引用操作,因此*iter++ 等效于*(iter++)。

 

六、箭头操作符

1、如果有一个指向Sales_item 对象的指针(或迭代器),则在使用点操作符前,需要对该指针(或迭代器)进行解引用:   (*sp).same_isbn(item2) ;

2、解引用操作定义了一个同义词:箭头操作符(->),(*p).foo ;等价于 p->foo ;

七、条件操作符:  cond  ?  expr1  :  expr2

1、cond 是一个条件判断表达式,条件操作符首先计算cond 值,如果值为0,条件为false,如果值为非0,条件为true;条件为true时计算expr1,否则计算expr2.

2、在使用时,必须严格使用圆括号将条件操作符括起来。

八、sizeof操作符:作用是返回一个对象或类型名的长度,返回值的类型为size_t。

使用sizeof的结果部分地依赖所涉及的类型:

1、  对char类型或值为char类型的表达式做sizeof操作保证得 1.

2、  对引用类型做sizeof操作将返回存放此引用类型对象所需的内存空间大小。

3、  对指针做sizeof操作将返回存放指针所需的内存大小;注意,如果要获取该指针所指向的对象的大小,则必须对该指针进行解引用。

4、  对数组做sizeof操作等效于将其元素类型做sizeof操作的结果乘上数组元素的个数,因为sizeof返回整个数组在内存中的存储长度。

九、逗号操作符: 逗号表达式是一组由逗号分隔的表达式,这些表达式从左向右计算。逗号表达式的结果是其最右表达式的值。

十、复合表达式:操作数的分组结合方式取决于操作符的优先级和结合性。

结合性见P147

两个指导原则有助于处理复合表达式:

(1)       在表达式上按程序逻辑要求使用圆括号强制操作数的组合。

(2)       如果要修改操作数的值,则不要在同一个语句的其他地方使用该操作数。

十一、new和delete 表达式

1、  在动态创建对象时,总是对它做初始化也是一个好办法。

2、  对于内置类型,采用不同初始化方式则有显著的差别:

Int  *pi = new int;                 没有初始化;

Int  *pi = new int();          初始化为0;

(值初始化的()语法必须置于类型名后面,而不是变量后。)

3、  delete pi; 如果指针指向的不是用new分配的内存地址,则在该指针上使用delete时不合法的!

注意:一旦删除了指针所指向的对象,立即将指针置为0,这样就非常清楚地表明指针不再指向任何对象。

4、尽管程序员不能改变const对象的值,但可以撤销对象本身!

posted @ 2012-07-12 22:08  欢_全力以赴  阅读(161)  评论(0编辑  收藏  举报