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
4294967264//-32的二进制补码转换为无符号十进制数
32
-32
0
0
P38
练习2.5
- 字符字面值 宽字符字面值 字符串字面值 宽字符串字面值
- 十进制字面值 无符号十进制字面值 长整型十进制字面值 无符号长整型十进制字面值 八进制字面值 十六进制字面值
- 双精度浮点型字面值 单精度浮点型字面值 扩展精度浮点型字面值
- 十进制字面值 无符号十进制字面值 双精度浮点型字面值 双精度浮点型字面值
练习2.6
第一行整数是十进制的,第二行整数是八进制的,八进制中没有数字9,无效。
练习2.7
- Who goes with Fergus?\n 字符串字面值//八进制数ASC||码
- 31.4 扩展精度浮点型字面值
- 1024 单精度浮点型字面值
- 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
- 定义
- 定义
- 声明
P43
练习2.12
其中a c d 非法
P45
练习2.13
100
练习2.14
合法
100 45
P46
练习2.15
- 合法,但会丢失精度;
- 不合法,引用的类型的初始值必须是一个对象;
- 合法;
- 不合法,引用必须被初始化。
练习2.16
- 合法,把d赋值为3.14159;
- 合法,把i赋值到d,类型会转换;
- 合法,把d赋值到i,类型会转换;
- 合法,把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
- 不合法,变量未初始化;
- 合法;
- 合法;
- ++cnt合法,++sz不合法,因为const变量不可改变。
P57
练习2.27
- 不合法,引用的值必须是一个对象;
- 合法,将p2设为一个常量指针,初始化对象为引用i2所指的值;
- 合法,将i设为常量,r设置为常量的引用。(const int &r=0是正确的,但是int &r = 0是不正确的);
- 合法,p3为指向常量的常量型指针,初始值为i2的地址;
- 合法,p1为指向常量的指针,初始值为i2的地址;
- 不合法,没有初始化;;
- 合法。
练习2.28
- 不合法,常量指针cp未初始化;
- 不合法,常量指针p2未初始化;
- 不合法,常量ic未初始化;
- 不合法,常量指针p3未初始化;
- 合法,指向常量的指针 可以不初始化。
练习2.29
- 合法
- 不合法,const int 和 int 不是一个类型,指向常量的指针在赋值时必须类型一致;
- 不合法,ic是const int;
- 不合法,p2是常量指针不能再次赋值;
- 不合法,ic是const int 不可被再次赋值。
P58
练习2.30
v2是顶层const,其值不可改变;v1不是const;p1不是const;r1不是const;p2是底层const;p3最左是底层const,右侧是顶层const;r2不是const。
练习2.31
- r1=v2;//合法,v2是顶层const
- p1=p2;//不合法,p1是非常量,p2是常量,不可进行赋值操作,不能将const int *类型的值分配到到int *类型的实体
- p2=p1;//合法
- p1=p3;//p3既是顶层const,又是底层const不能将const int *类型的值分配到到int *类型的实体
- 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;
}
}