C++Primer第五版习题答案详解(四)
第4章 表达式
练习4.1
105
练习4.2
(a) 可改为 *(vec.begin())
(b)可改为 (*vec.begin()+1)
练习4.4
1 | int main() |
练习4.5
1 | cout << -30 * 3 + 21 / 5 << endl;// -86 |
练习4.6
1 | int main() |
练习4.7
溢出:当计算结果超出该类型所能表示的范围就会产生溢出
练习4.8
相等运算符先求值,逻辑与、逻辑或运算优先级相同,按照从左到右的顺序求值
练习4.9
1 | const char *cp = "Hello World"; |
练习4.10
1 | int main() |
练习4.11
1 | if ((a>b) && (b>c) && (c>d)) |
练习4.12
i != (j<k) 先判断j<k,i为得到的布尔值取反
练习4.13
1 | d = i = 3.5; // i = 3, d = 3; i = 3.5, 将3.5隐式转化为整型。 |
练习4.14
1 | if (42 = i) //报错,不能对常量42赋值。 |
练习4.15
1 | //dval = ival = pi = 0; |
练习4.16
1 | if (p = getPtr()!= 0) // 可能会先判断!=, 再把结果赋值给p,改为if ((p = getPtr()) != 0) |
练习4.17
前置的递增运算符:先算后用,后置的递增运算符:先用后算。递减相同
练习4.18
会先向后移动一个元素,再输出移动后的值。输出范围为第二个元素到最后一个元素的下一个元素。由于最后一个元素的下一个元素未知,所以会访问到未知内存
练习4.19
1 | ptr != 0 && *ptr++; //判断ptr是否为空,并且ptr指向的值是否为0; |
练习4.20
1 | *iter++; // 合法,先对iter+1,再返回iter初始值的副本,再对该副本进行解引用 |
练习4.21
1 | int main() |
练习4.22
1 | int main() |
练习4.23
1 | string s = "word"; |
练习4.25
<< | 二进制左移运算符,左操作数的值向左移动右操作数指定的位数 |
---|---|
>> | 二进制右移运算符,左操作数的值向右移动右操作数指定的位数 |
q =0000 0000 0000 0000 0000 0000 0111 0001
~q = 1111 1111 1111 1111 1111 1111 1000 1110
(~q) << 6 = 1111 1111 1111 1111 1110 0011 1000 0000
练习4.26
因为老师学生有31个,所使用的类型最少需要有32位,但是在某些机器上,unsigned int 可能就不是32位了
练习4.27
1 | unsigned long ul1 = 3, ul2 = 7; |
练习4.28
1 | int main() |
练习4.29
1 | int main() |
练习4.30
1 | sizeof x + y; // sizeof(x) + y; |
练习4.31
在for循环中使用前置版本和后置版本都能得到相同的结果。这里使用前置版本的原因,就是4.5节中的建议所述:“前置版本的递增运算符避免了不必要的工作,它把值加1后直接返回改变了运算对象。与之相比,后置版本需要将原始值存储下来以便于返回这个未修改的内容,如果我们不需要修改前的值,那么后置版本的操作就是一种浪费。”
练习4.32
1 | constexpr int size = 5; |
循环遍历ia数组。ix和ptr的作用相同,一个使用下标遍历,一个使用指针遍历
练习4.33
因为逗号表达式的优先级最低,按照预期,如果someValue为真,冒号后面的语句不会再执行了,但实际上,编译器会认为冒号后面的–x属于三目运算符中的语句,而–y属于一个单独的语句。也就是( someValue ? ++x, ++y : --x), --y;
因此,如果someValue为真,则执行++x,++y,–y,最后得到的结果是y本身。如果someValue为假,则执行–x,–y,最终的结果是–y的值
练习4.34
类型 | 名称 | 类型 | 名称 |
---|---|---|---|
bool | flag | char | cval |
short | sval | unsignedshort | usval |
int | ival | unsigned int | uival |
long | lval | unsigned long | ulval |
float | fval | double | dval |
1 | if (fval) // float类型转化为bool类型 |
练习4.35
1 | char cval; |
练习4.36
1 | i *= static_cast<int> (d); |
练习4.37
1 | int i; |
练习4.38
1 | double slope = static_cast<double>(j/i); |