C++ Primer 5th Ch04 表达式
C++ Primer 5th Ch04 表达式

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);

上一篇   这一个多月的生病小结与反思

下一篇   C++ Primer 5th Ch05 语句