C++ Primer(第五版)课后习题记录 —— 第四章

第四章 表达式

练习4.1

105

练习4.2

(a) *vec.begin()
(b) *(vec.begin() + 1)

练习4.3

可以接受。程序的潜在缺陷可以通过程序员调整表达式来避免,而相比之下,代码生成效率更重要。

练习4.4

(12 / 3) / 4 + 5 * 15 + (24 % 4) / 2
输出为91。

练习4.5

(a) -86
(b) -18
(c) 0
(d) -2

练习4.6

k 为1则是奇数,为0则是偶数。
k = (m % 2) ? 1 : 0;

练习4.7

计算结果超出了该类型所能表示的数值范围。

练习4.8

逻辑与先判断左侧对象,若为真再求右侧对象。
逻辑或先判断左侧对象,若为假才求右侧对象。
相等性运算符的求值顺序未知。

练习4.9

左侧的 cp 代表的是该指针的地址,大于0,为真。右侧的 *cp 代表的是该字符数组的首字母 H 的数值,为真。

练习4.10

while ((cin >> num) && num != 42)

练习4.11

a > b && b > c && c > d

练习4.12

先判断 i 是否等于 j ,若等于则判断 k 是否大于1,若不等于,则判断 k 是否大于0。

练习4.13

(a) d=3; i=3
(b) i=3; d=3.5

练习4.14

执行第一行会报错;
执行第二行会进入无限循环;

练习4.15

pi 的类型无法转换为 ival 的类型。
所以对 pi 应单独赋值。

练习4.16

(a) if 语句中的条件恒为真。改为
if (p = getptr() && p != 0)
(b) 同理。 改为
if (i == 1024)

练习4.17

前置版本吧对象本身作为左值返回,后置版本怎是把对象的原始值作为右值返回。所以如果我们不需要修改前的值,那后置版本的操作就是一种浪费。

练习4.18

每次返回将pbeg向前移动一位后的元素,导致无法输出第一个元素。并且可能导致最后程序试图解引用一个不存在的元素。

练习4.19

(a) ptr指针不为空且指向的元素不为0。
(b) ival不为-1或0,同时使ival加一。
(c) 错误,由于不等式两边计算的先后顺序没被规定,会发生错误,应改为:

vec[ival + 1] <= vec[ival];
++ival;

练习4.20

(a) 合法。返回iter指向的字符串,并使iter指针加一。
(b) 不合法。字符串没有++这种运算。
(c) 不合法。解引用运算符优先级低于点运算符。
(d) 合法。判断iter所指向的字符串是否为空。
(e) 不合法。字符串类型无++这种运算。
(f) 合法。判断iter所指向的字符串是否为空,并使iter指针加一。

练习4.21

#include <iostream>
#include <vector>
using namespace std;
int main(){
    vector<int> vec{1, 2, 3, 4, 5, 6, 7, 8, 9};
    for(auto &c : vec){
        c = (c % 2 == 1) ? c*2 : c;
        cout << c << endl;
    }
    return 0;
}

练习4.22

//版本1
finalgrade = (grade > 90) ? "high pass" : (grade > 75) ? "pass" : (grade < 60 ) ? "fail" : "low pass";
// 版本2
if(grade > 90)
    finalgrade = "high pass";
else if (grade > 75)
    finalgrade =  "pass";
else if (grade > 60)
    finalgrade = "low pass";
else finalgrade = "fail";

当然是用多个 if 语句的版本更容易理解了。

练习4.23

条件运算符的优先级很低,所以应该在合适的地方加上括号。

//修改定义p1的语句
string p1 = s + (s[s.size() - 1] == 's' ? "" : "s");

练习4.24

//使用左结合律时,语句等同于
finalgrade = ((grade > 90) ? "high pass" : (grade < 60)) ? "fail" : "pass";

这样,如果 grade 大于90,输出的是 fail。

练习4.25

16进制形式为 00001C40 。值为7232。

练习4.26

unsigned int 类型在某些机器上没有32位,表示不了所有同学。

练习4.27:

分别是 3 7 1 1 。

练习4.28:

#include <iostream>
using namespace std;
int main(){
    cout << "bool : "<< sizeof(bool) << endl;
    cout << "char : "<< sizeof(char) << endl;
    cout << "wchar_t : "<< sizeof(wchar_t) << endl;
    cout << "char16_t : "<< sizeof(char16_t) << endl;
    cout << "char32_t : "<< sizeof(char32_t) << endl;
    cout << "short : "<< sizeof(short) << endl;
    cout << "int : "<< sizeof(int) << endl;
    cout << "long : "<< sizeof(long) << endl;
    cout << "long long : "<< sizeof(long long) << endl;
    cout << "float : "<< sizeof(float) << endl;
    cout << "double : "<< sizeof(double) << endl;
    cout << "long double : "<< sizeof(long double) << endl;
    return 0;
}

练习4.29

输出

10
1

练习4.30

(a) (sizeof x) + y
(b) sizeof (p->mem[i])
(c) (sizeof a) < b
(d) sizeof (f())

练习4.31

使用这两种方法从结果上来看是没区别的,应该是接受了“除非必须,否则不用递增递减运算的后置版本”的建议。

练习4.32

使 ptr 指向 ia数组的尾后指针。

练习4.33

如果 someValue 真,则x和y都加一,等式结果为此时的y。
若为假,则x和y都减一,等式结果为此时的y。

练习4.34

(a) fval 转换成 bool 型。
(b) ival 转换成 float 型,然后等号右侧的结果转换成 double 型。
(c) cval 转换成 int 型,然后乘法的结果转换成 double 型。

练习4.35

(a) 先是 ‘a’ 转换成 int 型,然后 ‘a’ + 3 的结果转换成 char 型。
(b) ival 转换成 double 型,然后 ui 转换成 double 型,最后等号右侧的结果转换成 float 型。
(c) ui 转换成 float 型,然后等号右侧的结果转换成 double 型。
(d) ival 转换成 float 型,然后该结果转换成 double 型,最后的 double 型结果转换成 char 型。

练习4.36

i *= static_cast<int>(d);

练习4.37

(a) pv= static_cast<void*>(const_cast<void*>(ps)); //非常量地址才能存入 void*
(b) i = static_cast<int>(*pc);
(c) pv = static_cast<void*>(&d);
(d) pc = reinterpret_cast<char*>(pv);

练习4.38

将 j/i 以整型方式计算得到 int 型的结果,再将该结果转换为 double 型。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值