2.1
它们占据的最小比特数(最小存储空间)不同,分别为16位、 32位、64位和16位。一般而言,short 类型为半个机器字(word)长,int 类型为一个机器字长(一般编译器会将 int 的位数设置为32位), long 类型为一个或两个机器字长(在32 位机器中,int 类型和 long 类型的字长通常是相同的),而 long long 类型为两个机器字长。因此,它们的表示范围不同(分别用于表示不同尺寸的整数)。
无符号类型只能表示大于或等于 0 的数;带符号类型则可以表示正数、负数和 0。
二者的存储位数不同(一般而言,float 类型为 32 个二进制位,double 类型为 64 个二进制位),因而取值范围不同;此外两者的精度也不同(float 类型只能保证 6 位有效数字,而 double类型至少能保证 10 位有效数字),然而大多数编译器都实现了更高的精度(一般来说,类型 float 和 double 分别有7和16个有效位)。
2.8
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 3 int main() 4 { 5 //2的ASCII码为50,转换为八进制就为062,M的ASCII码为77,转换为十六进制就为0x4d 6 std::cout << "62x4d "; 7 std::cout << "62 x4d "; 8 return 0; 9 }
2.9
(a)(c)非法,其中(c)的报错信息为“wage未定义”!
(b)(d)谈不上非法(因为编译器没报错),只是i的值都被强制类型转换为3了。
补充:一般列表初始化都不可以涉及强制类型转换!!
2.30
顶层const:v2、p3
底层const:p2、p3、r2
2.31
r1 = v2:合法,因为v2是顶层const,所以执行对象的拷贝时不受影响
p1 = p2:非法,p2是底层const,而p1不是;又因为p2是常量,所以不满足“非常量可以转换成常量”,故非法
p2 = p1:合法,尽管p1和p2不同时具备底层const,但是,非常量可以转换成常量(即int *可以转换成const int*)
p1 = p3:非法,尽管p3既是顶层const也是底层const,但拷贝时我们更在乎它是一个底层const,所以原因和第二题一样
p2 = p3:合法,p2是底层const,而p3包含底层const的定义,即p2和p3同时具备底层const
2.32
非法,不能将变量赋给指针(变量)。
改正:constexpr int null = 0; int *p = null;
2.33
a = 42; 因为a是一个int 型变量,所以a的值变为42
b = 42; 同a
c = 42; 同a
d = 42; 因为d是一个指向int型的指针,故不可赋值为一个整型数
e = 42; e是一个指向整数常量的指针,同d
g = 42; 不可行,因为g绑定了一个整型常量,不可以修改g的值
2.35
i是int型常量,j是int型变量,k是const int &(绑定到一个int型变量),p是指向int型常量的指针(const int *),j2是int型常量(const int),k2是整型常量引用(const int &,不可以通过k2修改变量的值)。
2.36
变量名 | 变量类型 | 最终值 |
a | int | 4 |
b | int | 4 |
c | int | 4 |
d | int & | 4 |
2.37
变量名 | 变量类型 | 最终值 |
a | int | 3 |
b | int | 4 |
c | int | 3 |
d | int & | 3 |
2.38
auto:依据初始值来推算变量的类型,即必须初始化;还有使用引用对象的类型以及忽略顶层const
decltype:依据表达式的类型推算变量的类型,可不初始化(引用除外);还有使用引用类型以及保留顶层const;再者就是表达式可产生引用的两种情形(解引用和括号())
2.40
struct Sales_data { string isbn; //书的ISBN unsigned num = 0; //售出的本数 double earn = 0.0; //销售收入 };
2.41
(1.20)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 struct Sales_data { 7 string bookNo; //书的ISBN 8 unsigned units_sold = 0; //售出的本数 9 double revenue = 0.0; //销售收入 10 }; 11 12 int main() 13 { 14 Sales_data book; 15 while (cin >> book.bookNo >> book.units_sold >> book.revenue) { 16 cout << book.bookNo << " " << book.units_sold << " " << book.revenue << endl; 17 } 18 return 0; 19 }
(1.21)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 struct Sales_data { 7 string bookNo; //书的ISBN 8 unsigned units_sold = 0; //售出的本数 9 double revenue = 0.0; //销售收入 10 }; 11 12 int main() 13 { 14 Sales_data book1, book2; 15 cin >> book1.bookNo >> book1.units_sold >> book1.revenue; 16 while (cin >> book2.bookNo >> book2.units_sold >> book2.revenue) { 17 if (book1.bookNo == book2.bookNo) 18 cout << book1.bookNo << " " << book1.units_sold + book2.units_sold << " " << book1.revenue + book2.revenue << endl; 19 else cout << "两本书的ISBN必须相同! "; 20 } 21 return 0; 22 }
(1.22)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 struct Sales_data { 7 string bookNo; //书的ISBN 8 unsigned units_sold = 0; //售出的本数 9 double revenue = 0.0; //销售收入 10 }; 11 12 int main() 13 { 14 Sales_data book, total; 15 cin >> total.bookNo >> total.units_sold >> total.revenue; 16 while (cin >> book.bookNo >> book.units_sold >> book.revenue) { 17 if (book.bookNo == total.bookNo) { 18 total.revenue += book.revenue; 19 total.units_sold += book.units_sold; 20 } 21 else break; 22 } 23 cout << total.bookNo << " " << total.units_sold << " " << total.revenue << endl; 24 return 0; 25 }
其他的意义同上。