C++ primer_5th_chapter4 problem_solving

 

 

4.1:105

4.2:*(vec.begin()),*(vec.beign())+1

4.3:可以接受,因为遵循开发规范编写的代码,出现程序潜在缺陷的几率比较小,而代码生成效率很重要

4.4:((12/3)*4)+((5*15)+((24%4)/2))=91

代码验证:

#include<iostream>

using namespace std;

int main()

{

cout<<12/3*4+5*15+24%4/2<<endl;

return 0;

}

4.5

  • -86
  • 18
  • 0
  • -2

4.6:number%2?false:true

4.7:溢出指的是计算的结果超出该类型能表达的范围,下面是示例

int number = 32767;

number++;//假设int类型占16位

number/0;

int number = -32768;

number--;

4.8

  • 逻辑与(&&):从左向右计算,当遇到一个值为假时停止运算,返回假,否则返回真
  • 逻辑或(||):从左向右计算,当遇到第一个值为真时停止运算,返回真,否则返回假
  • 相等性与运算:现将所有的bool值转换为算术类型,false转为0,true转为1

4.9:先计算并判断cp,然后对cp进行解引用,再判断*cp

4.10

int main()

{

int num;

cin >> num;

while(num!=42)

{

cin >> num;

cout << "plz continue enter number" << endl;

}
cout << "yes now the number is 42" << endl;

return 0;

}

 

4.11:(a>b&&b>c&&c>d)?true:false

4.12:将i与j<k的结果进行比较,相等是表达式返回false,否则返回true

4.13

  • 3.0
  • 3
  • 4.14
  • 非法语句,编译报错
  • i被赋予42的值

4.15:不能用指针赋值给一个int型变量,应该改为

*pi = dval = ival = 0;

4.16

  • 先计算后面的判断式,再进行赋值,应该改为if((p=getptr())!=0)
  • if始终为真,应该改为if(i==1024)

4.17:前置运算符是直接将变量+1,值是+1后的值,而后置运算符要先保存一个现有变量的副本,表达式使用这个值,接下来再对值++

4.18:输出不了第一个vector对象的值,其余与后置相同

4.19

  • ptr的值不为0且不指向空地址时表达式为真
  • ival的值不为0和-1时为真
  • vec中后一个元素大于前一个元素时为真

4.20

  • 合法,iter先向后移动一位,然后进行解引用
  • 不合法,不能先对iter解引用再自增,因为string类不支持自增操作
  • 不合法,不能对iter.empty()解引用,正确写法应该是(*iter).empty()
  • 合法,等价于(*iter).empty()
  • 不合法,理由同第二条
  • 合法,先对iter调用empty方法,再对iter进行自增

4.21

vector<int> v;

for (int i = 1; i <= 10; ++i)

v.push_back(i);

for (auto it = v.begin(); it != v.end(); ++it)

(*it) % 2 ? ((*it)=(*it) * 2) : false;

for (auto it = v.begin(); it != v.end(); ++it)

cout << *it << " ";

显然,使用多个if的语句更好理解

条件表达式版本

int grade;

cin >> grade;

cout << ((grade > 90) ? "high pass" : (grade < 60) ? "fail" : (grade > 60 && grade < 75) ? "low pass" :"pass");

if语句版本

int grade;

cin >> grade;

if (grade < 60)

cout << "fail" << endl;

else if (grade <= 75)

cout << "low pass" << endl;

else if (grade < 90)

cout << "pass" << endl;

else

cout << "high pass" << endl;

4.23:不应该把一个加法表达式放在判断的左侧

正确写法:

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

 

4.24:先判断成绩是否大于90,再判断是否小于60,最后得出结果

4.25:10111111

4.26:可能因为int只有16位而得不到正确结果

4.27

  • 3
  • 7
  • true
  • true

4.28

int a;

unsigned int b;

long c;

unsigned long d;

long long e;

unsigned long long f;

char g;

bool h;

float i;

double j;

cout << sizeof(a)<<endl;

cout << sizeof(b)<<endl;

cout << sizeof(c)<<endl;

cout << sizeof(d)<<endl;

cout << sizeof(e)<<endl;

cout << sizeof(f)<<endl;

cout << sizeof(g)<<endl;

cout << sizeof(h)<<endl;

cout << sizeof(i)<<endl;

cout << sizeof(j)<<endl;

4.29:结果是10和2,第二行代码的执行结果和想象的不一样,暂时不知原因

4.30

  • (sizeof x)+y;
  • 无需改变
  • (sizeof a)<b;
  • 无需改变

4.31:前置和后置是没有影响的

int x[5], cnt = 5;

for (int ix = 0; ix != 5; ix++, cnt--)

{

cout << "this is " << ix << "times cycle" << endl;

x[ix] = cnt;

cout << ix << " " << cnt << endl;

}

4.32:遍历整个ia数组,对其进行操作

4.33:当somevalue不等于0时,对x和y进行自增,否则自减

4.34

  • float转换为bool型
  • float加上int型之后转换为double
  • 转换为double

4.35

  • 没有
  • 发生了,运算结果被转为float类型
  • 发生了,运算结果转为double类型
  • 发生了,运算结果有算术类型转为char

4.36:i*=(int)d;

4.37

 

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

4.38:强制执行浮点数除法并把结果保存到一个double型变量中

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值