-
练习4.1
求值结果为105 -
练习4.2
(a) *(vec.begin())
(b) (*(vec.begin())) + 1
-
练习4.3
我认为可以接受。因为大部分时候可以规避在同一表达式同时修改同一对象。 (不成熟的看法) -
练习4.4
4.4验证程序代码
(((12 / 3) * 4) + (5 * 15)) + ((24 % 4) / 2)
-
练习4.5
(a) -86
(b) -18
(c) 42
(d) -2 -
练习4.6
x%2 -
练习4.7
12*10000000000000000000000
INT_MAX + 1
INT_MAX * 2
- 练习4.8
先求值 && 后求值
先求值 || 后求值
== 无规定求值顺序
-
练习4.9
首先判断cp是否为空指针,如果不是空指针,则判断cp[0]的值是否为'\0'。 -
练习4.10
while(std::cin >> a && a != 42)
-
练习4.11
a > b && b > c && c > d -
练习4.12
首先判断j是否小于k
如果j小于k,则判断i是否不等于1
如果j不小于k,则判断i是否不等于0 -
练习4.13
(a) i的值为3,d的值为3.0
(b) i的值为3,d的值为3.5 -
练习4.14
if (42 = i)
编译错误,无法执行
if (i = 42)
42赋值给i,并进入if语句执行
- 练习4.15
错误原因:指针不能赋值给int
修改:
pi = 0;
dval = ival = 0;
- 练习4.16
(a) 程序会首先计算getPtr()函数值和0进行比较是否相等,然后把比较结果赋值给p。另外getPtr()函数值被计算了两遍。
修改:
if((p = getPtr()) != 0)
(b) c程序会首先把1024赋值给i,然后再把i的值转换为bool型看是否为true。
修改:
if(i == 1024)
-
练习4.17
前置递增运算符返回加1之后的对象,是左值。
后置递增运算符返回加1之前的对象,是右值。 -
练习4.18
不会输出第一个元素,并且会输出最后一个元素后面位置的内容。 -
练习4.19
(a) 含义:ptr是否为空指针而且ptr的内容是否为0,并且把ptr的值+1(如果ptr非空)。
(b) 表达式不正确,修改为:
ii = ival;
++ival && ii
ival和ival+1的值是否都不为0
(c) 表达式不正确,修改为:
ii = ival;
vec[ii] <= vec[++ival]
判断vec[ival+1]是否大于vec[ival]
-
练习4.20
(a) 合法。
含义:得到iter的值,并且iter迭代器前进一个对象。
(b) 合法。
含义:iter指向的对象的值+1。
(c) 不合法。
iter没有empty()成员,应该先解引用得到对象再调用empty()成员。
(d) 合法。
调用iter所指对象的empty()成员。
(e) 合法。
iter指向的对象的值+1。
(f) 合法。
调用iter所指对象的empty()成员,同时iter迭代器前进一个对象。 -
练习4.21
4.21程序代码 -
练习4.22
4.22条件运算符程序代码
4.22if程序代码
我觉得if语句更容易理解。 -
练习4.23
因为“+”的优先级比条件运算符高,从而s会先与s[size()-1]进行加操作,然后与's'相比较,从而引发错误。
修改:
string p1 = s + (s[s.size() - 1] == 's' ? "" : "s");
- 练习4.24
如果满足左结合律,求值顺序是:
((grade > 90) ? "high pass" : (grade < 60)) ? "fail" : "pass";
-
练习4.25
二进制的值为
1111111 11111111 11100011 01000000 -
练习4.26
如果int占16位,那么quiz1将无法存储第27个学生的信息。 -
练习4.27
(a) 类型为unsigned long
结果为 3
(b) 类型为unsigned long
结果为 7
(c) 类型为bool
结果为 true
(d) 类型为bool
结果为 true -
练习4.28
4.28程序代码 -
练习4.29
4.29程序代码
预测结果:
10
1
实际结果为:
10
2
原因:64位系统指针位8字节,但是程序是32位的所以int为4字节 -
练习4.30
(a) sizeof(x + y)
(b) sizeof(p->mem[i])
(c) (sizeof a) < b
(d) sizeof(f())
-
练习4.31
后置版本的递增运算符要保存递增之前的对象副本,额外消耗了资源。但是我们又不需要对象副本。
4.31程序代码 -
练习4.32
对ia数组的长度循环一遍。 -
练习4.33
先计算someValue的值,为真则执行++x,++y,然后把递增后的y作为表达式结果。 如果someValue的值为假,则--x,--y,然后把递减的y作为表达式结果。 -
练习4.34
(a) float转换为bool
(b) int转换为float,再转换为double
(c) char转换为int,再转换为double -
练习4.35
(a) char转换为int,再转换为char
(b) int转换为double,unsigned int转换为double,再转换为float
(c) unsigned int转换为float,再转换为double
(d) int转换为float,再转换为double,再转换为char -
练习4.36
i *= static_cast<int>(d);
- 练习4.37
(a) pv = static_cast<void *>((const_cast<string *>(ps)));
(b) i = static_cast<int>(*pc);
(c) pv = static_cast<void *>(&d);
(d) pc = static_cast<char *>(pv);
- 练习4.38
首先计算j/i的值,再强制转换为double类型,为slope初始化。