练习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],看下一个元素是否比当前元素大。
这里的表达式不正确…… 不是很清楚是什么意思,这里表达式是否正确,个人认为判断的条件还不足。