第四章 4.5节练习

练习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],看下一个元素是否比当前元素大。

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值