《C++ primer》第五版习题答案整理——第二章 变量和基本类型

P32

练习2.1

C ++保证short和int至少为16位,long至少32位,long long至少为64位。

有符号类型可以表示正数,负数和零,而无符号类型只能表示不小于零的数字。

C和C ++标准没有指定float,double和long double的表示。 所有这三个都可能实现为IEEE双精度。

练习2.2

使用double,或者也可以float。

P35

练习2.3&&练习2.4

32

4294967264//-32的二进制补码转换为无符号十进制数

32

-32

0

0

P38

练习2.5

  1. 字符字面值 宽字符字面值 字符串字面值 宽字符串字面值
  2. 十进制字面值 无符号十进制字面值 长整型十进制字面值 无符号长整型十进制字面值 八进制字面值 十六进制字面值
  3. 双精度浮点型字面值 单精度浮点型字面值 扩展精度浮点型字面值
  4. 十进制字面值 无符号十进制字面值 双精度浮点型字面值 双精度浮点型字面值

练习2.6

第一行整数是十进制的,第二行整数是八进制的,八进制中没有数字9,无效。

练习2.7

  1. Who goes with Fergus?\n 字符串字面值//八进制数ASC||码
  2. 31.4 扩展精度浮点型字面值
  3. 1024 单精度浮点型字面值
  4. 3.14 扩展精度浮点型字面值

练习2.8

#include<iostream>

int main()

{

    std::cout << "\062\115\012";

    std::cout << "\062\11\115\012";

    return 0;

}

P40

练习2.9

  • 输入运算符从左侧运算对象所指定的输入流读取数据,存入右侧运算对象,是赋值。但赋值并不是初始化,该值是未定义的。应先定义该值。

Int input_value=0;

std::cin>>imput_value;

  • double i={3.14};
  • wage变量没有被定义,变量定义的形式是在类型说明符后紧跟多个变量名时,以逗号分隔,以分号结束。

double wage;

double salary=wage=9999.99;

  • 把一个浮点数赋给整数类型时,会进行近似处理,结果值将仅保留浮点数中小数点之前的部分。

double i=3.14

练习2.10

变量 global_str的初值为默认空串;变量global_int的初值默认为0;local_int和local_str在函数体内部将不被初始化,前者的值是未定义的,但后者在std中可以无须显式初始化而定义对象,是一个空串。

P42

练习2.11

  1. 定义
  2. 定义
  3. 声明

P43

练习2.12

其中a c d 非法

P45

练习2.13

100

练习2.14

合法

100 45

P46

练习2.15

  1. 合法,但会丢失精度;
  2. 不合法,引用的类型的初始值必须是一个对象;
  3. 合法;
  4. 不合法,引用必须被初始化。

练习2.16

  1. 合法,把d赋值为3.14159;
  2. 合法,把i赋值到d,类型会转换;
  3. 合法,把d赋值到i,类型会转换;
  4. 合法,把i赋值到d,类型会转换;

P47

练习2.17

10 10

P51

练习2.18

#include<iostream>

int main()

{

    int a = 0, b = 1;

    int* p1 = &a, * p2 = p1;

    p1 = &b;//更改指针的值

    *p2 = b;//更改指针所指对象的值

    std::cout << *p1 << *p2 <<std:: endl;

}

练习2.19

指针本身是一个对象,允许指针之间的拷贝和赋值,也可以指向不同的对象,可以不初始化(建议初始化所有指针);而引用是已经存在的一个对象的别名,总是得到最初绑定的初始值,初始化变量时,引用和它的初始值绑定在一起,没有方法使得引用重新绑定到另一个对象,因此引用必须初始化。

练习2.20

把i的值变为1764//42*42

练习2.21

非法定义,类型不一致;

非法定义,没有地址操作符;

合法定义

练习2.22

第一个判断p是否为空指针;第二个判断指向对向是否为0。

练习2.23 

不可以,不知道指针是否有效。

练习2.24

因为lp的类型不是int,而void定义了一个空指针,可以接受任意类型的对象。

P53

练习2.25

ip为int型的指针,i为int型,r为i的引用;

i为int类型,ip为int类型的空指针;

ip为int类型的指针,ip2为int类型。

P54

练习2.26

  1. 不合法,变量未初始化;
  2. 合法;
  3. 合法;
  4. ++cnt合法,++sz不合法,因为const变量不可改变。

P57

练习2.27

  1. 不合法,引用的值必须是一个对象;
  2. 合法,将p2设为一个常量指针,初始化对象为引用i2所指的值;
  3. 合法,将i设为常量,r设置为常量的引用。(const  int  &r=0是正确的,但是int  &r = 0是不正确的);
  4. 合法,p3为指向常量的常量型指针,初始值为i2的地址;
  5. 合法,p1为指向常量的指针,初始值为i2的地址;
  6. 不合法,没有初始化;;
  7. 合法。

练习2.28

  1. 不合法,常量指针cp未初始化;
  2. 不合法,常量指针p2未初始化;
  3. 不合法,常量ic未初始化;
  4. 不合法,常量指针p3未初始化;
  5. 合法,指向常量的指针 可以不初始化。

练习2.29

  1. 合法
  2. 不合法,const int 和 int 不是一个类型,指向常量的指针在赋值时必须类型一致;
  3. 不合法,ic是const int;
  4. 不合法,p2是常量指针不能再次赋值;
  5. 不合法,ic是const int 不可被再次赋值。

P58

练习2.30

v2是顶层const,其值不可改变;v1不是const;p1不是const;r1不是const;p2是底层const;p3最左是底层const,右侧是顶层const;r2不是const。

练习2.31

  1. r1=v2;//合法,v2是顶层const
  2. p1=p2;//不合法,p1是非常量,p2是常量,不可进行赋值操作,不能将const int *类型的值分配到到int *类型的实体
  3. p2=p1;//合法
  4. p1=p3;//p3既是顶层const,又是底层const不能将const int *类型的值分配到到int *类型的实体
  5. p2=p3;//合法

P60

练习2.32

非法

int null=0,int *p=&null;

或者改为*p=nullptr;

P62

练习2.33

a=42;

b=42;

c=42;

d错误,不能将int型的值分配到整型指针;

e错误;

g错误。

练习2.34

#include<iostream>

int main()

{

    int i = 0, & r = i;

    auto a = r;

    const int ci = i, & cr = ci;

    auto b = ci;

    auto c = cr;

    auto d = &i;

    auto e = &ci;

    const auto f = ci;

    auto &g = ci;

    a = 42;

    b = 42;

    c = 42;

    *d = 42;

    e = &c;

    return 0;

}   

练习2.35

j的类型为int;k为常量int的引用;p为常量int的指针;j2为常量int;k2是常量int的引用。

#include<iostream>

int main()

{

    const int i = 42;

    auto j = i; const auto& k = i; auto* p = &i;

    const auto j2 = i, & k2 = i;

    return 0;

}   

P64

练习2.36

a,b均是int型;

c是int型;

d是int&;

程序结束时4 4 4 4

练习2.37

a int 3;

b int 4;

c int 3;

d int& 3;

练习2.38

主要的区别有两点:

1:如果使用引用类型,auto会识别为其所指对象的类型,decltype则会识别为引用的类型。

2:decltype(())双括号的差别。

#include<iostream>

int main()

{

    int i = 0, & r = i;

    //相同

    auto a = i;

    decltype(i) b = i;

    //不同

    auto c = r;

    decltype(r) d = i;

}  

P65

练习2.39

#include<iostream>

struct Foo {}

int main()

{

    return 0;

}

报错

严重性

代码

说明

项目

文件

禁止显示状态

错误(活动)

E0065

应输入“;”

CPP Homework

C:\VS2019Projects\CPP Homework\源.cpp

3

练习2.40

#include<iostream>

struct Sales_date

{

    std::string bookNo;

    std::string bookName;

    unsigned units_sold = 0;

    double revenue = 0.0;

    double price = 0.0;

    std::string booktype;

    double sum = 0.0;

};

练习2.41

1.5.1

1.5.1--1.20

#include<iostream>

struct Sales_date

{

    std::string bookNo;

    std::string bookName;

    unsigned units_sold = 0;

    double revenue = 0.0;

};

int main()

{

    Sales_date date;

    double price = 0.0;

    std::cin >> date.bookNo >>date.units_sold >> price;

    date.revenue = date.units_sold * price;

    std::cout << date.bookNo << " "<<date.units_sold<<" " << date.revenue;

    return 0;

   }

1.5.1--1.21

#include<iostream>

struct Sales_date

{

    std::string bookNo;

    unsigned units_sold = 0;

    double revenue = 0.0;

};

int main()

{

    Sales_date date1,date2;

    double price = 0.0;

    std::cin >> date1.bookNo >>date1.units_sold >> price;

    date1.revenue = date1.units_sold * price;

    std::cin >> date2.bookNo >> date2.units_sold >> price;

    date2.revenue = date2.units_sold * price;

    if (date1.bookNo == date2.bookNo)

    {

         unsigned totalCnt = date1.units_sold + date2.units_sold;

         double totalRevenue = date1.revenue + date2.revenue;

         std::cout << date1.bookNo << " " << totalCnt << " " << totalRevenue << " ";

         if (totalCnt != 0)

             std::cout << totalRevenue / totalCnt << std::endl;

         else

             std::cout << "没卖出" << std::endl;

    return 0;

    }

    else {

         std::cerr << "两次必须输入同一种书" << std::endl;

         return -1;

    }

   }

1.5.2&1.6

#include<iostream>

struct Sales_date

{

    std::string bookNo;

    unsigned units_sold = 0;

    double revenue = 0.0;

    double price = 0.0;

};

int main()

{

    Sales_date total;

    if (std::cin >> total.bookNo >> total.units_sold >> total.price)

    {

         total.revenue = total.units_sold * total.price;

         Sales_date temp;

         while (std::cin >> temp.bookNo >> temp.units_sold >> temp.price)

         {

             total.revenue = temp.units_sold * temp.price;

             if (total.bookNo == temp.bookNo)

             {

                  total.units_sold += temp.units_sold;

                  total.revenue += temp.revenue;

             }

             else

             {

                  std::cout << total.bookNo << " " << total.units_sold << " " << total.revenue << " ";

                  if (total.units_sold != 0)

                      std::cout << total.revenue / total.units_sold << std::endl;

                  else

                      std::cout << "没卖出" << std::endl;

                  total.bookNo = temp.bookNo;

                  total.units_sold = temp.units_sold;

                  total.price = total.price;

                  total.revenue = temp.revenue;

             }

             std::cout << total.bookNo << " " << total.units_sold << " " << total.revenue << " " << total.revenue / total.units_sold << std::endl;

             return 0;

         }

   

    }

    else

    {

         std::cout << "请输入" << std::endl;

         return -1;

    }

}

P68

练习2.42

头文件:

Sales_data.h

#pragma once

#ifndef SALES_DATA_H_

#define SALES_DATA_H_


#include <string>


struct Sales_date

{

    std::string bookNo;

    unsigned units_sold = 0;

    double revenue = 0.0;

    double price = 0.0;

};


#endif

1.5.1

1.5.1--1.20

#include <iostream>

#include "Sales_date.h"

int main()

{

    Sales_date date;

    double price = 0.0;

    std::cin >> date.bookNo >> date.units_sold >> price;

    date.revenue = date.units_sold * price;

    std::cout << date.bookNo << " " << date.units_sold << " " << date.revenue;

    return 0;

}

1.5.1--1.21

#include <iostream>

#include "Sales_date.h"

int main()

{

    Sales_date date1,date2;

    double price = 0.0;

    std::cin >> date1.bookNo >>date1.units_sold >> price;

    date1.revenue = date1.units_sold * price;

    std::cin >> date2.bookNo >> date2.units_sold >> price;

    date2.revenue = date2.units_sold * price;

    if (date1.bookNo == date2.bookNo)

    {

         unsigned totalCnt = date1.units_sold + date2.units_sold;

         double totalRevenue = date1.revenue + date2.revenue;

         std::cout << date1.bookNo << " " << totalCnt << " " << totalRevenue << " ";

         if (totalCnt != 0)

             std::cout << totalRevenue / totalCnt << std::endl;

         else

             std::cout << "没卖出" << std::endl;

    return 0;

    }

    else {

         std::cerr << "两次必须输入同一种书" << std::endl;

         return -1;

    }

   }

1.5.2&1.6
 

#include<iostream>

#include "Sales_date.h"

int main()

{

    Sales_date total;

    if (std::cin >> total.bookNo >> total.units_sold >> total.price)

    {

         total.revenue = total.units_sold * total.price;

         Sales_date temp;

         while (std::cin >> temp.bookNo >> temp.units_sold >> temp.price)

         {

             total.revenue = temp.units_sold * temp.price;

             if (total.bookNo == temp.bookNo)

             {

                  total.units_sold += temp.units_sold;

                  total.revenue += temp.revenue;

             }

             else

             {

                  std::cout << total.bookNo << " " << total.units_sold << " " << total.revenue << " ";

                  if (total.units_sold != 0)

                      std::cout << total.revenue / total.units_sold << std::endl;

                  else

                      std::cout << "没卖出" << std::endl;

                  total.bookNo = temp.bookNo;

                  total.units_sold = temp.units_sold;

                  total.price = total.price;

                  total.revenue = temp.revenue;

             }

             std::cout << total.bookNo << " " << total.units_sold << " " << total.revenue << " " << total.revenue / total.units_sold << std::endl;

             return 0;

         }

   

    }

    else

    {

         std::cout << "请输入" << std::endl;

         return -1;

    }

}

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值