2.1 类型 int、long、long long 和 short 的区别是什么?无符号类型和带符号类型的区别是什么?float 和 double的区别是什么?
int 最小是16位, long 是32位,long long是64位。
无符号只能表示大于等于0的值,有符号类型可以表示正数、负数、0
float表示单精度浮点数,double为双精度浮点数。float和double分别有7和16位有效位。
2.2 计算按揭贷款时,对于利率、本金和付款分别应选择何种数据类型?说明你的理由。
选用double类型,理由emm常识么??
2.3 读程序写结果
unsigned u = 10, u2 = 42;
std::cout << u2 - u << std::endl;
std::cout << u - u2 << std::endl;
int i = 10, i2 = 42;
std::cout << i2 - i << std::endl;
std::cout << i - i2 << std::endl;
std::cout << i - u << std::endl;
std::cout << u - i << std::endl;
32
4294967264
32
-32
0
0
2.4 编写程序检查你的估计是否正确,如果不正确,请仔细研读本节直到弄明白问题所在。
#include <iostream>
int main(){
unsigned u = 10, u2 = 42;
std::cout << u2 - u << std::endl;
std::cout << u - u2 << std::endl;
int i = 10, i2 = 42;
std::cout << i2 - i << std::endl;
std::cout << i - i2 << std::endl;
std::cout << i - u << std::endl;
std::cout << u - i << std::endl;
return 0;
}
结果:
2.5 指出下述字面值的数据类型并说明每一组内几种字面值的区别:
- (a) ‘a’, L’a’, “a”, L"a"
- (b) 10, 10u, 10L, 10uL, 012, 0xC
- © 3.14, 3.14f, 3.14L
- (d) 10, 10u, 10., 10e-2
(a) 字符型字面值、宽字符型字面值、字符串型字面值、宽字符串型字面值。
(b) 十进制整型字面值、十进制无符号整型字面值、十进制长整型字面值、无符号长整型字面值、八进制整型字符值、十六进制整型字符值
© double字面值、float字面值、long double字面值
(d) 十进制整型字面值、无符号整型字面值、double字面值、double字面值
2.6 下面两组定义是否有区别,如果有,请叙述之:
int month = 9, day = 7;
int month = 09, day = 07;
第一行为十进制整型,第二行为八进制整型。
因为八进制没有9所以第二行的month这个变量错了。
2.7 下述字面值表示何种含义?它们各自的数据类型是什么?
- (a) “Who goes with F\145rgus?\012”
- (b) 3.14e1L
- © 1024f
- (d) 3.14L
(a)“Who goes with Fergus?(换行)” 字符串字面值
(b)long double 3.14
(c)不合法,f表示float
(d)long double
2.8 请利用转义序列编写一段程序,要求先输出 2M,然后转到新一行。修改程序使其先输出 2,然后输出制表符,再输出 M,最后转到新一行。
#include <iostream>
int main(){
std::cout << "2\115" << '\n';
std::cout << '2' << '\t' << '\115' << '\n';
}
2.9 解释下列定义的含义,对于非法的定义,请说明错在何处并将其改正。
- (a) std::cin >> int input_value;
- (b) int i = { 3.14 };
- © double salary = wage = 9999.99;
- (d) int i = 3.14;
(a) 没有定义,一个没有初始化的内置类型就是没有定义
int input_value = 0;
std::cin >> input_value;
(b) i是整型数据,用列表初始化内置类型的变量时,如果存在数值丢失的可能,会报错
double i = {3.14};
© wage变量未定义就使用。
double wage;
double salary = wage = 9999.99
(d) 将一个double类型字面值赋给一个整型变量。i会直接赋值为3.
double i = 3.14;
2.10 下列变量的初值分别是什么?
std::string global_str;//空字符串
int global_int;//0
int main()
{
int local_int;//未定义
std::string local_str;//空字符串
}
2.11 指出下面的语句是声明还是定义:
- (a) extern int ix = 1024; //定义
- (b) int iy; //定义
- © extern int iz; //声明
2.12 请指出下面的名字中哪些是非法的?
- (a) int double = 3.14;// 和关键字重复不行
- (b) int _;
- © int catch-22;//非法字符
- int 1_or_2 = 1;//有关键字
- double Double = 3.14;
2.13 下面程序中 j 的值是多少?
int i = 42;
int main()
{
int i = 100;
int j = i;
}
100
2.14 下面的程序合法吗?如果合法,它将输出什么?
int i = 100, sum = 0;
for (int i = 0; i != 10; ++i)
sum += i;
std::cout << i << " " << sum << std::endl;
100 输出0-9的和:45
2.15 下面的哪个定义是不合法的?为什么?
- (a) int ival = 1.01;
- (b) int &rval1 = 1.01;
- © int &rval2 = ival;
- (d) int &rval3;
(b)(d)不合法
(b)引用必须要绑定在对象
(d)引用必须初始化
2.16 考察下面的所有赋值然后回答:哪些赋值是不合法的?为什么?哪些赋值是合法的?它们执行了哪些操作?
int i = 0, &r1 = i; double d = 0, &r2 = d;
- (a) r2 = 3.14159;
- (b) r2 = r1;
- © i = r2;
- (d) r1 = d;
(a) 合法:d的值被赋为3.14159
(b)合法:d做类型转换
©合法:小数被截断
(d)合法:小数被截断
2.17 执行下面的代码段将输出什么结果?
int i, &ri = i;
i = 5; ri = 10;
std::cout << i << " " << ri << std::endl;
输出:10, 10
2.18 编写代码分别改变指针的值以及指针所指对象的值。
#include <iostream>
int main(){
int i = 10, j = 20;
int * p = &i;
//改变指针指向对象的值
*p = 30;
std::cout << "i= " << i << std::endl;
//改变指针的值
p = &j;
std::cout << "*p= " << *p << std::endl;
}
2.19 说明指针和引用的主要区别
引用 | 指针 |
---|---|
不是对象,只是别名 | 是对象 |
创建的时候必须初始化 | 创建的时候不用初始化 |
一旦初始化之后就不能绑定给其他对象 | 可以重新指向其他对象 |
2.20 请叙述下面这段代码的作用。
int i = 42;//定义一个整型变量并初始化为42
int *p1 = &i; //创建一个指针变量p1指向i对象
*p1 = *p1 * *p1;//将i的值改为42*42
2.21 请解释下述定义。在这些定义中有非法的吗?如果有,为什么?
int i = 0;
(a) double* dp = &i;//非法,一个指向double类型的指针不能指向整型变量i
(b) int *ip = i;//非法,指针存储的值应该是对象的地址
(c) int *p = &i;//合法
2.22 假设 p 是一个 int 型指针,请说明下述代码的含义。
if (p) // 判断指针p是不是空指针
if (*p) // 判断指针p指向的对象的值是不是0
2.23 给定指针 p,你能知道它是否指向了一个合法的对象吗?如果能,叙述判断的思路;如果不能,也请说明原因。
不能,因为首先要确定这个指针是不是合法的,才能判断它所指向的对象是不是合法的。
2.24 在下面这段代码中为什么 p 合法而 lp 非法?
int i = 42;
void *p = &i;//可以指向任意对象
long *lp = &i;//指向long类型的指针不能指向int类型的变量
2.25 说明下列变量的类型和值。
(a) int* ip, i, &r = i;
(b) int i, *ip = 0;
(c) int* ip, ip2;
(a)ip是一个指向int型指针,i是int型变量,如果i是在函数体外则为0,r是i的引用
(b)i是一个int型变量,ip是一个空指针
(c)ip是一个指向int型指针,ip2是一个int型变量
2.26 下面哪些语句是合法的?如果不合法,请说明为什么?
const int buf; // 不合法, const 对象必须初始化
int cnt = 0; // 合法
const int sz = cnt; // 合法
++cnt; ++sz; // 不合法, const 对象不能被改变
2.27 下面的哪些初始化是合法的?请说明原因。
int i = -1, &r = 0; // 不合法, 引用不能直接给字面值
int *const p2 = &i2; // 合法
const int i = -1, &r = 0; // 合法
const int *const p3 = &i2; // 合法
const int *p1 = &i2; // 合法
const int &const r2; // 不合法, 引用没有这种写法
const int i2 = i, &r = i; // 合法
2.28 说明下面的这些定义是什么意思,挑出其中不合法的。
int i, *const cp; // 不合法, cp必须初始化
int *p1, *const p2; // 不合法, p2必须初始化
const int ic, &r = ic; // 不合法, ic必须初始化
const int *const p3; // 不合法, p3必须初始化
const int *p; // 合法. 一个指针,指向 const int
2.29 假设已有上一个练习中定义的那些变量,则下面的哪些语句是合法的?请说明原因。
i = ic; // 合法, 常量赋值给普通变量
p1 = p3; // 不合法, p3为指针常量是不能赋值普通指针
p1 = ⁣ // 不合法, ic是常量只能用常量指针来指向
p3 = ⁣ // 合法, p3 是常量指针且指向常量
p2 = p1; // 合法, 可以将普通指针赋值给常量指针
ic = *p3; // 合法, 对 p3 取值后(int) 然后赋值给 ic
2.30 对于下面的这些语句,请说明对象被声明成了顶层const还是底层const?
const int v2 = 0;//顶层 int v1 = v2;
int *p1 = &v1, &r1 = v1;
const int *p2 = &v2, *const p3 = &i, &r2 = v2;//p2 是底层,p3 既是顶层,r2 是底层。
2.31 假设已有上一个练习中所做的那些声明,则下面的哪些语句是合法的?请说明顶层const和底层const在每个例子中有何体现。
r1 = v2; // 合法, 顶层在拷贝时不受影响
p1 = p2; // 不合法, p1 不是底层const
p2 = p1; // 合法, int* 可以转换成const int*
p1 = p3; // 不合法, p3 是一个底层const,p1 不是
p2 = p3; // 合法, p2 和 p3 都是底层const,p3顶层不影响
2.32 下面的代码是否合法?如果非法,请设法将其修改正确。
int null = 0, *p = null;
非法
int null = 0, *p = 0;
2.40 根据自己的理解写出 Sales_data 类,最好与书中的例子有所区别。
struct Sales_Data{
string bookNo;
string bookName;
unsigned units_sold = 0;//销售数量
double revenue = 0.0;//销售收入
double price = 0.0;//单价
};
2.41 使用你自己的Sale_data类重写1.5.1节(第20页)、1.5.2节(第21页)和1.6节(第22页)的练习。眼下先把Sales_data类的定义和main函数放在一个文件里。
1.51 读取一组书籍销售记录,将每条记录打印到标准输出上
#include <iostream>
#include <string>
struct Sale_Data
{
std::string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
int main(){
// for(Sales_Data sd; cin >> sd; cout << sd << endl);
Sales_Data book;
double price;
std::cin >> book.bookNo >> book.units_sold >> price;
book.revenue = book.units_sold * price;
std::cout << book.bookNo << " " << book.units_sold << " " << book.revenue << " " << price;
return 0;
}
#include <iostream>
struct Sales_Data{
std::string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
int main(){
Sales_Data book, book2;
double price;
std::cin >> book.bookNo >> book.units_sold >> price;
std::cin >> book2.bookNo >> book2.units_sold >> price;
if(book.bookNo == book2.bookNo){
std::cout << book.units_sold + book2.units_sold << std::endl;
}else{
std::cerr << "输入有误" << std::endl;
}
return 0;
}
#include <iostream>
struct Sales_Data{
std::string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
int main(){
Sales_Data total_book;
double total_price;
if(std::cin >> total_book.bookNo >> total_book.units_sold >> total_price){
// int cnt = 1;
total_book.revenue = total_book.units_sold * total_price;
Sales_Data book;
double book_price;
while(std::cin >> book.bookNo >> book.units_sold >> book_price){
book.revenue = book.units_sold * book_price;
if(total_book.bookNo == book.bookNo){
total_book.units_sold += book.units_sold;
total_book.revenue += book.revenue;
// ++cnt;
}else{
std::cout << total_book.bookNo << " " << total_book.units_sold << " " << total_book.revenue << total_price << std::endl;
// std::cout << total_book.bookNo << "has " << cnt << "recordings!";
total_book.bookNo = book.bookNo;
total_price = book_price;
total_book.units_sold = book.units_sold;
total_book.revenue = book.revenue;
}
}
std::cout << total_book.bookNo << " " << total_book.units_sold << " " << total_book.revenue << total_price << std::endl;
// std::cout << total_book.bookNo << "has " << cnt << "recordings!";
}
else{
std::cout << " No " << std::endl;
return -1;
}
return 0;
}
1.5.2
#include <iostream>
struct Sales_Data{
std::string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
int main(){
Sales_Data total_book;
double total_price;
if(std::cin >> total_book.bookNo >> total_book.units_sold >> total_price){
int cnt = 1;
total_book.revenue = total_book.units_sold * total_price;
Sales_Data book;
double book_price;
while(std::cin >> book.bookNo >> book.units_sold >> book_price){
book.revenue = book.units_sold * book_price;
if(total_book.bookNo == book.bookNo){
// total_book.units_sold += book.units_sold;
// total_book.revenue += book.revenue;
++cnt;
}else{
std::cout << total_book.bookNo << "has " << cnt << "recordings!";
total_book.bookNo = book.bookNo;
total_price = book_price;
total_book.units_sold = book.units_sold;
total_book.revenue = book.revenue;
}
}
std::cout << total_book.bookNo << "has " << cnt << "recordings!";
}
return 0;
}