Directory
Note
左值和右值
当一个对象被用作右值时,用的是对象的值(内容);当被用作左值时,用的是对象的身份(在内存中的位置)。
###命名的强制类型转换
cast-name<type>(expression);
cast-name有四种:
- static_cast 任何具有明确定义的类型转换,只要不包含底层cosnt
- dynamic_cast 支持运行时类型识别
- const_cast 只能改变运算对象的底层const
- reinterpret_cast 为运算对象的位模式提供较低层次上的重新解释
Exercise
4.1 表达式 5 + 10 * 20 / 2 的求值结果是多少?
105
4.2 根据4.12节中的表,在下述表达式的合理位置添加括号,使得添加括号后运算对象的组合顺序与添加括号前一致。
* (a) *vec.begin()
* (b) *vec.begin() + 1
4.3 C++语言没有明确规定大多数二元运算符的求值顺序,给编译器优化留下了余地。这种策略实际上是在代码生成效率和程序潜在缺陷之间进行了权衡,你认为这可以接受吗?请说出你的理由。
4.4 在下面的表达式中添加括号,说明其求值过程及最终结果。编写程序编译该(不加括号的)表达式并输出结果验证之前的推断。
12 / 3 * 4 + 5 * 15 + 24 % 4 / 2
((12/3)4) + (515) + ((24%4)/2)
4.5 写出下列表达式的求值结果。
-30 * 3 + 21 / 5 // -86
-30 + 3 * 21 / 5 // -18
30 / 3 * 21 % 5 // 0
-30 / 3 * 21 % 4 // -2
4.6 写出一条表达式用于确定一个整数是奇数还是偶数。
4.7 溢出是何含义?写出三条将导致溢出的表达式。
当计算的结果超出该类型所能表示的范围时就会产生溢出。
4.9 解释在下面的if语句中条件部分的判断过程。
const char *cp = "Hello World";
if (cp && *cp)
先判断指针cp是否为空,再判断字符串首字母是否为空
4.12 假设i、j 和k 是三个整数,说明表达式 i != j < k 的含义。
<
的优先级大于!=
4.14 执行下述 if 语句后将发生什么情况?
if (42 = i) // 编译错误。赋值运算符左侧必须是一个可修改的左值。而字面值是右值。
if (i = 42) // true.
4.29 推断下面代码的输出结果并说明理由。实际运行这段程序,结果和你想象的一样吗?如不一样,为什么?
int x[10]; int *p = x;
cout << sizeof(x)/sizeof(*x) << endl;
cout << sizeof(p)/sizeof(*p) << endl;
10 2
4.33 根据4.12节中的表说明下面这条表达式的含义。
someValue ? ++x, ++y : --x, --y
逗号表达式的优先级最低。因此
(someValue ? ++x, ++y : --x), --y
4.37 用命名的强制类型转换改写下列旧式的转换语句。
int i; double d; const string *ps; char *pc; void *pv;
(a) pv = (void*)ps;
(b) i = int(*pc);
(c) pv = &d;
(d) pc = (char*)pv;
(a) pv = static_cast<void*>(const_cast<string*>(ps));
(b) i = static_cast<int>(*pc);
(c) pv = static_cast<void*>(&d);
(d) pc = reinterpret_cast<char*>(pv);
上一篇 这一个多月的生病小结与反思