C++ Primer 第五版:第四章「表达式」习题答案
第四章:表达式
练习4.1
表达式 5 + 10 * 20 / 2 的求值结果是多少?
105
练习4.2
根据4.12节中的表,在下述表达式的合理位置添加括号,使得添加括号后运算对象的组合顺序与添加括号前一致。
- (a) *vec.begin()
- (b) *vec.begin() + 1
1 | *(vec.begin()) |
练习4.3
C++语言没有明确规定大多数二元运算符的求值顺序,给编译器优化留下了余地。这种策略实际上是在代码生成效率和程序潜在缺陷之间进行了权衡,你认为这可以接受吗?请说出你的理由。
可以接受。C++的设计思想是尽可能地“相信”程序员,将效率最大化。然而这种思想却有着潜在的危害,就是无法控制程序员自身引发的错误。因此 Java 的诞生也是必然,Java的思想就是尽可能地“不相信”程序员。
练习4.4
在下面的表达式中添加括号,说明其求值过程及最终结果。编写程序编译该(不加括号的)表达式并输出结果验证之前的推断。
1 | 12 / 3 * 4 + 5 * 15 + 24 % 4 / 2 |
((12/3)*4) + (5*15) + ((24%4)/2)
实际输出结果:91。
练习4.5
写出下列表达式的求值结果。
1 | -30 * 3 + 21 / 5 // -90+4 = -86 |
练习4.6
写出一条表达式用于确定一个整数是奇数还是偶数。
1 | if (i % 2 == 0) /* ... */ |
练习4.7
溢出是何含义?写出三条将导致溢出的表达式。
溢出含义:当计算的结果超出该类型所能表示的范围时就会产生溢出。
1 | short svalue = 32767; ++svalue; // -32768 |
练习4.8
说明在逻辑与、逻辑或及相等性运算符中运算对象的求值顺序。
- 逻辑与运算符和逻辑或运算符都是先求左侧运算对象的值再求右侧运算对象的值,当且仅当左侧运算对象无法确定表达式的结果时才会计算右侧运算对象的值。这种策略称为短路求值。
- 相等性运算符未定义求值顺序。