4.1-4.12读书笔记

4.1 基础

根据4.12节中的表,在下述表达式的合理位置添加括号,使得添加括号后运算对象的组合顺序与添加括号前一致。
(a) *vec.begin()
(b) *vec.begin() + 1

*(vec.begin())
(*(vec.begin())) + 1
4.3 逻辑和关系运算符

说明在逻辑与、逻辑或及相等性运算符中运算对象的求值顺序。

  • 逻辑与运算符和逻辑或运算符都是先求左侧运算对象的值再求右侧运算对象的值,当且仅当左侧运算对象无法确定表达式的结果时才会计算右侧运算对象的值。这种策略称为 短路求值。
  • 相等性运算符未定义求值顺序。
4.4 赋值运算符

在下述语句中,当赋值完成后 i 和 d 的值分别是多少?
int i; double d;
d = i = 3.5;
i = d = 3.5;

i = 3, d = 3.0
d = 3.5, i = 3

下面的赋值是非法的,为什么?应该如何修改?
double dval; int ival; int *pi;
dval = ival = pi = 0;

p 是指针,不能赋值给 int ,应该改为:
dval = ival = 0;
pi = 0;

4.5 递增和递减运算符

说明前置递增运算符和后置递增运算符的区别。

前置递增运算符将对象本身作为左值返回,而后置递增运算符将对象原始值的副本作为右值返回。

假设 ptr 的类型是指向 int 的指针、vec 的类型是vector、ival 的类型是int,说明下面的表达式是何含义?如果有表达式不正确,为什么?应该如何修改?
(a) ptr != 0 && *ptr++
(b) ival++ && ival
© vec[ival++] <= vec[ival]

(a) 判断ptr 不是一个空指针,并且ptr 当前指向的元素的值也为真,然后将ptr指向下一个元素
(b) 判断 ival 的值为真,并且 (ival + 1) 的值也为真
© 表达式有误。C++并没有规定 <= 运算符两边的求值顺序,应该改为 vec[ival] <= vec[ival+1]

4.6成员运算符

假设 iter 的类型是 vector::iterator, 说明下面的表达式是否合法。如果合法,表达式的含义是什么?如果不合法,错在何处?
(a) *iter++;
(b) (*iter)++;
© *iter.empty();
(d) iter->empty();
(e) ++*iter;
(f) iter+±>empty();

(a)合法。返回迭代器所指向的元素,然后迭代器递增。
(b)不合法。因为vector元素类型是 string,没有 ++ 操作。
©不合法。这里应该加括号。
(d)合法。判断迭代器当前的元素是否为空。
(e)不合法。string 类型没有 ++ 操作。
(f)合法。判断迭代器当前元素是否为空,然后迭代器递增。

4.7 条件运算符

因为运算符的优先级问题,下面这条表达式无法通过编译。根据4.12节中的表指出它的问题在哪里?应该如何修改?
string s = “word”;
string pl = s + s[s.size() - 1] == ‘s’ ? “” : “s” ;
加法运算符的优先级高于条件运算符。因此要改为:

string pl = s + (s[s.size() - 1] == ‘s’ ? “” : “s”) ;

4.8 位运算符

如果一台机器上 int 占 32 位、char 占8位,用的是 Latin-1 字符集,其中字符’q’ 的二进制形式是 01110001,那么表达式’q’ << 6的值是什么?

首先将char类型提升为int 类型,等同于 00000000 00000000 00000000 01110001 << 6,结果是 00000000 00000000 00011100 01000000,转换是十进制是7232。

下列表达式的结果是什么?
unsigned long ul1 = 3, ul2 = 7;
(a) ul1 & ul2
(b) ul1 | ul2
© ul1 && ul2
(d) ul1 || ul2

(a) 3
(b) 7
© true
(d) ture

4.9 sizeof运算符

推断下面代码的输出结果并说明理由。实际运行这段程序,结果和你想象的一样吗?如不一样,为什么?
int x[10]; int *p = x;
cout << sizeof(x)/sizeof(*x) << endl;
cout << sizeof§/sizeof(*p) << endl;

第一个输出结果是 10。第二个结果是未定义。

4.10 逗号运算符

根据4.12节中的表说明下面这条表达式的含义。
someValue ? ++x, ++y : --x, --y

逗号表达式的优先级是最低的。因此这条表达式也等于:
(someValue ? ++x, ++y : --x), --y
如果 someValue的值为真,x 和 y 的值都自增并返回 y 值,然后丢弃 y 值,y递减并返回 y 值。如果 someValue的值为假,x 递减并返回 x 值,然后丢弃 x 值,y递减并返回 y 值。

4.11 类型转换

根据本节给出的变量定义,说明在下面的表达式中奖发生什么样的类型转换:
(a) if (fval)
(b) dval = fval + ival;
© dval + ival * cval;
需要注意每种运算符遵循的是左结合律还是右结合律。

(a) fval 转换为 bool 类型
(b) ival 转换为 float ,相加的结果转换为 double
© cval 转换为 int,然后相乘的结果转换为 double

char cval;
int ival;
unsigned int ui;
float fval;
double dval;
请回答在下面的表达式中发生了隐式类型转换吗?如果有,指出来。

(a) cval = ‘a’ + 3;
(b) fval = ui - ival * 1.0;
© dval = ui * fval;
(d) cval = ival + fval + dval;
(a) ‘a’ 转换为 int ,然后与 3 相加的结果转换为 char
(b) ival 转换为 double,ui 转换为 double,结果转换为 float
© ui 转换为 float,结果转换为 double
(d) ival 转换为 float,与fval相加后的结果转换为 double,最后的结果转换为char

用命名的强制类型转换改写下列旧式的转换语句。
int i; double d; const string *ps; char *pc; void pv;
(a) pv = (void
)ps;
(b) i = int(pc);
© pv = &d;
(d) pc = (char
)pv;

(a) pv = static_cast<void*>(const_cast<string*>(ps));
(b) i = static_cast(pc);
© pv = static_cast<void
>(&d);
(d) pc = static_cast<char*>(pv);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值