《C++ primer》第五版习题答案整理——第四章 表达式

  • 第四章  表达式

P123

练习4.1

105

练习4.2

  1. *(vec.begin())
  2. (*(vec.begin()))+1

P124

练习4.3

复合表达式的处理:使用括号强制达到目的、重复改变可能会导致错误。

P126

练习4.4

12/3*4+5*15+24%4/2  =  91;

练习4.5

(a) -86

(b) -18

(c) 0

(d) -2

练习4.6

int a;

if (a%2)

{

    cout<<"奇数"

}

else

{

    cout<<"偶数"

}

练习4.7

溢出的定义:当计算的结果超出了该类型所能表示的最大范围时就会产生溢出。

short a = 32768;

unsigned a = -10;

int a = 123456789*123456789;

P128

练习4.8

逻辑与:左面为真再判断右面

逻辑或:先判断左面为假再判断右面

相等性运算符:右边的转换为左边的类型再与左边比较

练习4.9

cp是一个指针,指向一个字符串,*cp是一个字符串

二者皆不为空,所以结果为真。

练习4.10

#include<iostream>

using namespace std;

int main()

{

    int i;

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

    {}

}

练习4.11

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

练习4.12

算数>关系>逻辑

根据优先级,先计算 < 运算符,对比 j < k是否为真,再计算 != 运算符,如果j<k为真,则i!=1时为真。如果j<k为假,则i!=0为真。

P131

练习4.13

  1. i=3, d=3.0
  2. i=3, d=3.5

练习4.14

第一个报错;

第二个判断为真。

练习4.15

无法将指针赋值给int型变量;

double dval; int ival; int *pi;
ival = dval = *pi =0;

练习4.16

  1. if ((p=getPtr())!=0)
  2. if (i==1024)

P133

练习4.17

前置的递增运算符:先算后用,后置的递增运算符:先用后算。递减一样。

练习4.18

使用前置递增运算符会导致向量中的第一个元素没有被输出,直到最后一个元素的后一个位置(未知的量,非常危险)

练习4.19

  1. (*ptr != 0) && (*ptr++)  判断ptr指针指向的int值是否为0
  2. 含义是先对ival加1,判断ival加1之前的值是否不为0,如果为真,则判断当前ival的值(ival加1后)是否不为0
  3. 错误,因为求值顺序不一定,会产生未定义的行为。

P134

练习4.20

  1. 合法,首先对iter解引用,然后让iter++指向下一个位置
  2. 不合法,返回iter指向的值为string ++操作无意义
  3. 不合法,解引用运算法优先级低于点运算符,iter为指针,不能使用点运算符
  4. 合法,相当于(*iter).empty()
  5. 不合法,*iter可以得到iter所指的字符串,但是字符串并没有++操作。
  6. 合法,首先判断iter所指向的值是否为空,再对iter加1

P135

练习4.21

#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
	vector<int> v;
	for (int i = 0; i < 10; i++)
	{
		v.push_back(i);
	}
	for (auto& j : v)
	{
		j = (j % 2 != 0) ? j * 2 : j;
		cout << j << ' ';
	}
	cout << endl;
	return 0;
}

练习4.22

条件运算符

#include<iostream>

#include<string>

#include<vector>

using namespace std;

int main()

{

    float grade;

    cin >> grade;

    string finalgrade = (grade > 90) ? "hingh pass" : (grade < 60) ? "fail" : (grade<75)?"lowpass":"pass";

    cout << finalgrade;

    return 0;

}

if语句

#include<iostream>

#include<string>

#include<vector>

using namespace std;

int main()

{

    float grade;

    cin >> grade;

    if (grade <= 90)

    {

         if (grade <= 75)

         {

             if (grade < 60)

                  cout << "fail" << endl;

             else

                  cout << "low pass" << endl;

         }

         else

             cout << "pass" << endl;

    }

    else

         cout << "high pass" << endl;

    return 0;

}

if语句更容易理解,较为直观。

练习4.23

条件运算符优先级过低

string pl = s + (s[s.size() - 1] == 's' ? "" : "s") ;

练习4.24

满足左结合律时会报错,有未明确的值在右侧;左结合律的话,先算(grade > 90)是否为true,不是的话条件运算表达式返回(grade < 60)的结果,在根据这个表达式的结果返回"fail" 或者"pass"

P139

练习4.25

1111 1111 1111 1111 1110 0011 1000 0000

练习4.26

因为老师学生有31个,所使用的类型最少需要有32位吧,但是在某些机器上,unsigned int 可能就不是32位了

练习4.27

u11 = 3 = 0000 0000 0000 0000 0000 0000 0000 0011

u12 = 7 =  0000 0000 0000 0000 0000 0000 0000 0111

  1. 3
  2. 7
  3. ture
  4. ture

P140

练习4.28

#include<iostream>

#include<string>

#include<vector>

using namespace std;

int main()

{

    cout << "bool " << sizeof(bool) << endl;

    cout << "char " << sizeof(char) << 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  p为一个地址,*p是一个int变量

练习4.30

  1. (sizeof x) +y
  2. sizeof(p->mem[i])
  3. (sizeof a) < b
  4. sizeof f()

P141

练习4.31

用前置版本是因为之前书中就提过后置版本可能会造成资源浪费

改成后置版本代码不需要改

练习4.32

ptr指向ia的begin,ix记录当前的位置,当ptr指向ia的最后一个,并且ix也等于ix的长度时循环终止

练习4.33

根据运算符优先级表  优先级: ++  >   ?:   >   ,

但由于?:是满足右结合律,

所以 = (someValue ? ++x, ++y : --x), --y

当 someValue 为真时,计算 ++x, ++y;在计算 --y;

当 someValue 为假时,计算 --x,在计算 --y;

P143

练习4.34

  1. fival转换为bool类型;
  2. ival 与 fval的和转换为 dval的类型;
  3.  cval 提升成 int,和 ival 相加后再提升为 double 和 dval 相加

练习4.35

    1. ‘a’ 先提升为 int 和 3 相加,在转换成 char 赋给 cval
    2. ival 先提升为 float,和 1.0 相乘,然后转换成 unsigned int,和 ui 做减法,其结果转换成 float 赋给 fval
    3. ui 转换成 float 和 fval 相加,其结果转换为 double 赋给 dval
    4. ival 提升成 float 和 fval 相加。其结果再提升为 double 和 dval 相加。再将其结果转换为 char 赋给 cval

P147

练习4.36

i *= static_cast<int>d;

练习4.37

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

练习4.38

将计算 (j / i) 的结果强制转换为 double 类型,然后赋给 slope。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值