练习4.17、4.18、4.19

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];
原文地址:https://www.cnblogs.com/Dark-King/p/9441859.html