[C++ primer] 第四章习题答案
4.1
105
4.2
(a)(vec.begin())
(b)(vec.begin() + 1)
4.3
可以,可以根据编程人员的需求自行添加括号改善
4.4
91
4.5
(a)-86
(b)-18
(c)0
(d)-2
4.7
当计算的结果超出该类型所能表示的范围时就会导致溢出
4.8
相等运算符先求值,再进行逻辑与操作,再进行逻辑或操作,按照从左到右的顺序求值。
4.9
cp指向的地址不为0,cp指向对象的值不为0
4.10
#include <iostream>
using namespace std;
int main()
{
int now;
while ((cin >> now) && (now != 42))
{
}
}
4.11
(a > b) && (b > c) && (c > d)
4.12
先取i值,再计算j < k是否成立,成立为大于0的数,否则为0。再计算i != (j < k) 。
算数>关系>逻辑
4.13
赋值运算符满足右结合律
(a)d = 3.0 , i = 3
(b)d = 3.5 , i = 3
4.14
(a)报错,赋值运算符左侧对象必须是一个可修改的左值
(b)将42赋给i,if条件始终为真
4.15
不能把指针的值赋给int
dval = ival = *pi = 0;
4.16
(a)会先执行!=再执行赋值
if((p = getPtr()) != 0)
(b)同4.14
if(i == 1024)
4.17
前置运算符:先修改运算对象,再将改变后的对象作为求值结果。
后置运算符:将原始对象的值存储下来返回这个未修改的内容,再改变对象的值。
比起前置运算符,后置运算符会导致一种浪费
4.18
会先向后移动一个元素,再输出移动后的值。输出范围为第二个元素到最后一个元素的下一个元素。由于最后一个元素的下一个元素未知,所以会访问到未知内存。
4.19
(a)ptr指向的地址不为0, 所指向的值不为0, ptr向前移动一个元素
(b)ival的值和ival下一个值均不为0
(c)运算顺序未知,不知道编译器会先算vec[ival++]还是vec[ival],因此结果是未知的。可以改为vec[ival + 1] <= vec[ival]
4.20
*表达式ptr->mem等价于(ptr).mem
后置运算符优先级高于解引用运算符, 前置运算符优先级低于解引用运算符
(a)合法,先对iter+1,再返回iter初始值的副本,再对该副本进行解引用
(b)不合法,string类型不能++操作
(c)不合法,iter是一个指针,没有empty()成员
(d)合法
(e)不合法,string类型不能++操作
(f)合法,++和->的优先级一样,所以遵循自左向右结合,先算iter++的值,返回iter初始值的副本,再进行empty()判断。
4.22
注意:条件运算符的优先级非常低, 因此当一条长表达式中嵌套了条件运算子表达式时,通常需要在它两端加上括号。
条件运算嵌套层数增加会导致代码的可读性急剧下降。
4.23
string p1 = (s + s[s.size() - 1] == 's' ? "" : "s");
4.25
‘q’ << 6运算会把结果隐式转化为int类型,因为6是int类型,再按位取反即可
1111 1111 1111 1111 1110 0011 1000 0000
4.26
在某些系统上,int占16为,因此如果用unsigned int来存储的话,在这些机器上就会发生位数不够用的情况。而unsigned long则可以保证在任何机器上都至少有32位。
4.27
(a)3
(b)7
(c)1
(d)1
4.29
10, sizeof(x) = 10*4, sizeof(*x) = 4
1, sizeof (p ) = 4(整型指针),sizeof(*p) = 4
4.32
遍历数组ia,其中ptr用指针遍历,ix用下标遍历
4.33
逗号的优先级最低
因为逗号表达式的优先级最低,则该语句为
someValue ? (++x, ++y : --x), --y;
如果条件为真, 执行++x, ++y, --y
如果条件为假, 执行–x, --y
4.35
(a)‘a’先转化为int进行计算,得到的结果再转化为char
(b)int转double,ui转double, 结果转float
(c)unsigned int先提升为float,float再转为double
(d)ival先转为float,float再转为double,最后double转为char
4.36
i *= static_cast<int> (d);
4.37
(a)pv = static_cast<void*>((const_cast<string>(ps))
(b)i = static_cast(pc)
(c)pv = static_cast<void >(&d)
(d)pc = static_cast<char>(pv)