第四章 4.5节练习

来源:互联网 发布:淘宝刷单兼职 360 编辑:程序博客网 时间:2024/05/23 16:59

练习4.17

说明前置递增运算符和后置递增运算符的区别。

解答:

【引用】前置版本将对象本身作为左值返回,后置版本则将对象原始值的副本作为右值返回。


练习4.18

如果第132页那个输出vector对象元素的while循环使用前置递增运算符,将得到什么结果?

解答:

这里会使得程序崩溃。

这里将打印:第二个元素,第三个元素。。。。第n个元素,还有end

end在这里相当于一个标识,里面没有任何元素,所以当要打印end解引用的值时肯定会出错。

测试程序:

#include <iostream>#include <vector>using namespace std;int main(){vector<int> ivec{ 1, 2, 3 };auto pbeg = ivec.begin();while (pbeg != ivec.end() && *pbeg >= 0){cout << *++pbeg << endl;}}

练习4.19

假设ptr的类型时执行int的指针、vec类型时vector<int>、ival的类型是int,说明下面的表达式是何含义?如果有表达式不正确,为什么?应该如何修改?

(a) ptr != 0 && *ptr++

(b) ival++ && ival

(c) vec[ival++] <= vec[ival]

解答:

(a)  (ptr != 0) && (*(ptr++)) 这样用括号标注一下可能会看的比较清楚。这个表达式是正确的,先判断指针是否为空,如果为空,判断失败;如果不为空,再看指针指向的是不是0,然后对指针进行地址偏移操作。

(b) 先判断ival是否为0,不为零的情况下,会继续判断,ival自加之后的值是否为0

(c) 这里比较了几个编译器的执行顺序,这个表达式等价于vec[val] <= vec[val+1],看下一个元素是否比当前元素大。

这里的表达式不正确…… 不是很清楚是什么意思,这里表达式是否正确,个人认为判断的条件还不足。


0 0