4.17:说明前置递增运算符和后置递增运算符的区别。
Ans:两者的作用对象都是左值运算对象,前者是将运算对象本身作为左值返回,就是将运算对象先递增再返回,后者是将运算对象的原始值的副本拷贝一份作为右值返回,实际上是先将运算对象返回,再让它递增。
4.18:如果132页那个输出vector对象元素的while循环使用前置递增运算符,将得到什么结果?
Ans:将会无法输出第一个vector对象元素,并且如果对象中没有在循环结束之前停止下来,那么循环结束时,pbeg会指向一个未定义的不可预知的位置。
4.19:假设ptr的类型是指向int类型的指针、vec的类型是vector<int>、ival的类型是int,说明下面的表达式是何含义?如果有表达式不正确,为什么?应该如何修改?
(a) ptr !=0 && *ptr++ (b) ival++ && ival
(c) vec[ival++] <=vec[ival]
Ans:a)如果ptr不为空,接着才去执行对ptr进行解引用,然后才让ptr递增。但是这根据不同的指针指向的情况,可能会出现未定义的结果,也可能能正常执行。
b)&&的左边的值等于ival原始的值,而右边的值是ival+1后的值,只有当ival>0时整个表达式才为真。但是在同一个表达式中使用了一个对象并且还修改了它,然后在表达式的其他地方又使用了这个对象,是未定义的行为。应修改为ival&&ival+1
c)不正确,在同一个表达式中使用了一个对象并且还修改了它,然后在表达式的其他地方又使用了这个对象,是未定义的行为。
应修改为:
1 vec[ival]<=vec[ival+1];