《C++ Primer》5th 课后练习 第四章 表达式 11~21

练习4.11 书写一条表达式用于测试4个值a、b、c、d的关系,确保a大于b、b大于c、c大于d。

if(a>b && b>c && c>d)

练习4.12 假设i,j,k 是三个整数,说明表达式 i != j < k 的含义。

相当于i!=(j<k)在进行i!=()时会先将bool类型转换成int类型,值为0或1。

练习4.13 在下述语句中,当赋值完成后 i 和 d 的值分别是多少?

int i;   double d;
d = i = 3.5; // i = 3, d = 3.0
i = d = 3.5; // d = 3.5, i = 3

练习4.14 执行下述 if 语句后将发生什么情况?

if (42 = i)   // 编译错误。赋值运算符左侧必须是一个可修改的左值。而字面值是右值。
if (i = 42)   // true.

练习4.15 下面的赋值是非法的,为什么?应该如何修改?

double dval; int ival; int *pi;
dval = ival = pi = 0;

pi=0的值是int*类型他不能赋值给int类型变量。

dval = ival = 0;
pi = 0;

练习4.16 尽管下面的语句合法,但它们实际执行的行为可能和预期并不一样,为什么?应该如何修改?

if (p = getPtr() != 0)
if (i = 1024)

条件判断总是为 true, 应该改为:

if ((p = getPtr()) != 0)
if (i == 1024)

练习4.17 说明前置递增运算符和后置递增运算符的区别

前置递增运算符将对象本身作为左值返回,后置版本将对象原始值的副本作为右值返回。

扫描二维码关注公众号,回复: 8904563 查看本文章

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

会从vector对象的第二个元素开始取值,并且会在输出第一个负值或对v.end()非法取值后退出。

练习4.19 假设 ptr 的类型是指向 int 的指针、vec 的类型是vectorival 的类型是int,说明下面的表达式是何含义?如果有表达式不正确,为什么?应该如何修改?

(a) ptr != 0 && *ptr++  
(b) ival++ && ival
(c) vec[ival++] <= vec[ival] 

a 表示ptr不为0并且ptr指向的元素也不为0,并将ptr指针指向后一个元素。

b ival值为真,并且ival+1的值也为真

c 未定义错误,因为C++未规定<=号的求值顺序,应该改为vec[ival] <= vec[ival+1]

练习4.20 假设 iter 的类型是 vector::iterator, 说明下面的表达式是否合法。如果合法,表达式的含义是什么?如果不合法,错在何处?

(a) *iter++;
(b) (*iter)++;
(c) *iter.empty();
(d) iter->empty();
(e) ++*iter;
(f) iter++->empty();

a 合法,返回迭代器指向的元素,然后迭代器指向下一个元素

b 不合法,string类型不支持自增操作

c 不合法,itre是迭代器类型,没有empty()成员

d 合法,判断iter指向的string是否为空

e 不合法,string类型不支持自增操作

f 合法。判断迭代器当前元素是否为空,然后迭代器递增。

发布了276 篇原创文章 · 获赞 21 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_40758751/article/details/103986891