第五章 表达式
第五章 表达式
一、算术操作符:
一元操作符: +/- 正负号; 优先级最高
二元操作符: * / % 乘、除、求余, + - 加减号, 乘除求余高于加减
注意:两个整数相除,结果仍为整数,小数部分会被截断,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对象的值,但可以撤销对象本身!